webentwicklung-frage-antwort-db.com.de

IntelliJ Idea 2017.3 Kotlin Spring Boot App kann nicht gestartet werden - Die @Configuration-Klasse ist möglicherweise nicht endgültig

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')
}
6
codependent

Das Aktualisieren des Kotlin-Plugins von IntelliJ auf 1.2.21 wurde korrigiert: https://plugins.jetbrains.com/plugin/6954-kotlin/update/42501

2
codependent

Zuallererst liegt alles an der Klasse Kotlin Klassendefinition :

Die open-Annotation einer Klasse ist das Gegenteil von Javas final: 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.

7
Stanislav

Wenn das Plugin-Update nicht hilft, prüfen Sie, ob die Version von Kotlin in Gradle mit der Kotlin-Version von Ide übereinstimmt.

0
Teimuraz

Wenn dieser Fehler bei IntelliJ auftritt, möchten Sie möglicherweise überprüfen, ob die Anmerkungsverarbeitung in IntelliJ aktiviert wurde.

0
BhathiyaW