web-dev-qa-db-fra.com

IntelliJ Idea 2017.3 incapable de démarrer l'application Kotlin Spring Boot - La classe de configuration peut ne pas être finale

J'ai pu lancer une application Spring Boot Kotlin à partir d'IntelliJ 2017.3. Après la dernière mise à jour du correctif IntelliJ, je ne peux plus démarrer cette application à partir de l'EDI, avec cette exception:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Configuration class 'AccessConfig' may not be final

Je peux le démarrer depuis un terminal comme d'habitude: Java -jar xxxx.jar

Cela n'a aucun sens puisque j'utilise le plugin Kotlin Spring nécessaire dans ma configuration Gradle:

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'
}

Des idées?

METTRE À JOUR:

Pour simplifier la reproduction, il suffit de créer un projet Spring Boot avec l'initialiseur Spring d'IntelliJ. Vous obtiendrez le même résultat:

DemoApplication:

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
    SpringApplication.run(DemoApplication::class.Java, *args)
}

Erreur:

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

Correction de la mise à niveau de la connexion Kotlin d'IntelliJ à la version 1.2.21: https://plugins.jetbrains.com/plugin/6954-kotlin/update/42501

2
codependent

Tout d'abord, tout cela est dû à la classe Kotlin définition de classe :

L'annotation open sur une classe est l'opposé de la final de Java: elle permet aux autres d'hériter de cette classe. Par défaut, toutes les classes de Kotlin sont finales.

donc si vous êtes libre de modifier votre code source, vous pouvez rendre votre classe non finale, en ajoutant simplement open à sa signature comme suit:

@SpringBootApplication
open class DemoApplication

    fun main(args: Array<String>) {
        SpringApplication.run(DemoApplication::class.Java, *args)
    }
}

ou l'une des solutions possibles, selon ce article :

@SpringBootApplication est une annotation pratique qui marque la classe avec les annotations @Configuration, @EnableAutoConfiguration et @ComponentScan. C'est l'annotation @Configuration qui force l'utilisation du mot-clé open.

Essayez de supprimer l'annotation @SpringBootApplication et d'annoter votre classe avec @EnableAutoConfiguration et @ComponentScan pour résoudre ce problème.

7
Stanislav

Si la mise à jour du plugin ne vous aide pas, vérifiez si la version de kotlin in gradle correspond à la version de kotlin de ide.

0
Teimuraz