Я пишу плагин 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 имеет другие проблемы ... У кого-нибудь есть идеи, что может быть не так?