Spring Boot внутри плагина Kotlin Gradle аварийно завершает работу с `NoSuchMethodError` - PullRequest
0 голосов
/ 06 апреля 2020

Я пишу плагин Gradle в Kotlin. Он использует Spring Boot CommandLineRunner - он делится кодом с другими приложениями Spring Boot в других модулях. Поэтому мне придется выполнить ручную настройку и DI, если я его удалю.

Это отлично работало с Spring Boot 2.1.x, но после обновления до 2.2.x плагин падает, когда он применяется, когда runApplication(...) выполнено:

java.lang.NoSuchMethodError: org.springframework.core.type.AnnotationMetadata.introspect(Ljava/lang/Class;)Lorg/springframework/core/type/AnnotationMetadata;

пока я вижу этот метод в AnnotationMetadata в зависимостях.

Вот упрощенная версия задачи моего плагина:

open class MyTask : DefaultTask() {
    @TaskAction
    fun action() {
        val args = arrayOf(project.rootDir.absolutePath)
        runApplication<MySpringBootApplication>(*args)
    }
}

и он вылетает на линии runApplication<MySpringBootApplication>(*args) с ошибкой NoSuchMethodError.

Это похоже на проблему с загрузчиком классов Java, но я не знаю, что сломано и как это исправить. Единственное отличие заключается в версии 2.1 и 2.2 Spring Boot (и их транзитивных зависимостях, конечно). Понижение до 2.1 работает, но это не вариант. Аналогично runApplication<MySpringBootApplication>(*args) в другом модуле Gradle этого же проекта, который создает приложение CLI, работает хорошо.

Это для JVM 8 (не может быть обновлено) и Kotlin 1.3.61. Kotlin 1.3.71 имеет другие проблемы ... У кого-нибудь есть идеи, что может быть не так?

...