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')
}
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
Tout d'abord, tout cela est dû à la classe Kotlin définition de classe :
L'annotation
open
sur une classe est l'opposé de lafinal
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.
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.