Ich konnte eine Spring Boot Kotlin App von IntelliJ 2017.3 starten. Nach dem letzten IntelliJ Fix-Update kann ich diese Anwendung nicht von der IDE aus starten. Diese Ausnahme wird angezeigt:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Configuration class 'AccessConfig' may not be final
Ich kann es wie gewohnt von einem Terminal aus starten: Java -jar xxxx.jar
Das macht keinen Sinn, da ich in meiner Gradle-Konfiguration das erforderliche Kotlin Spring-Plugin verwende:
buildscript {
ext {
kotlinVersion = '1.2.21'
springBootVersion = '2.0.0.RC1'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
jcenter()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
classpath 'org.asciidoctor:asciidoctor-gradle-plugin:1.5.3'
classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.2'
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.5"
}
}
apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'Eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven'
...
sourceCompatibility = 1.8
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
repositories {
mavenLocal()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
maven { url "http://repo.maven.Apache.org/maven2" }
maven { url 'https://jitpack.io' }
}
ext {
springCloudVersion = 'Finchley.M5'
mmaReleaseTrainVersion = 'Callao-SNAPSHOT'
junitVersion = '5.0.2'
}
Irgendwelche Ideen?
UPDATE:
Eine einfachere Art der Reproduktion: Erstellen Sie einfach ein Spring Boot-Projekt mit dem Spring-Initialisierer von IntelliJ, und Sie erhalten dasselbe Ergebnis:
DemoApplication:
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
SpringApplication.run(DemoApplication::class.Java, *args)
}
Error:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Configuration class 'DemoApplication' may not be final. Remove the final modifier to continue.
Offending resource: com.example.demo.DemoApplication
build.gradle:
buildscript {
ext {
kotlinVersion = '1.2.10'
springBootVersion = '1.5.10.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
}
}
apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'Eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")
compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Das Aktualisieren des Kotlin-Plugins von IntelliJ auf 1.2.21 wurde korrigiert: https://plugins.jetbrains.com/plugin/6954-kotlin/update/42501
Zuallererst liegt alles an der Klasse Kotlin Klassendefinition :
Die
open
-Annotation einer Klasse ist das Gegenteil von Javasfinal
: Sie ermöglicht es anderen, von dieser Klasse zu erben. Standardmäßig sind alle Klassen in Kotlin final
wenn Sie also Ihren Quellcode ändern können, können Sie Ihre Klasse nicht als final definieren, indem Sie einfach open
wie folgt zur Signatur hinzufügen:
@SpringBootApplication
open class DemoApplication
fun main(args: Array<String>) {
SpringApplication.run(DemoApplication::class.Java, *args)
}
}
oder eine der möglichen Lösungen laut diesem Artikel :
@SpringBootApplication
ist eine praktische Annotation, die die Klasse mit den Annotationen@Configuration
,@EnableAutoConfiguration
und@ComponentScan
markiert. Es ist die Annotation@Configuration
, die die Verwendung des offenen Schlüsselworts erzwingt.
Um zu versuchen, die Annotation @SpringBootApplication
zu entfernen und Ihre Klasse mit @EnableAutoConfiguration
und @ComponentScan
zu kommentieren, um dieses Problem zu lösen.
Wenn das Plugin-Update nicht hilft, prüfen Sie, ob die Version von Kotlin in Gradle mit der Kotlin-Version von Ide übereinstimmt.
Wenn dieser Fehler bei IntelliJ auftritt, möchten Sie möglicherweise überprüfen, ob die Anmerkungsverarbeitung in IntelliJ aktiviert wurde.