IntelliJ 2017.3からSpring Boot Kotlinアプリを起動できました。最後のIntelliJ修正アップデートの後、このアプリケーションをIDEから起動できず、次の例外が発生します。
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Configuration class 'AccessConfig' may not be final
通常どおり端末から起動できます:Java -jar xxxx.jar
私はGradle設定で必要なKotlin Springプラグインを使用しているので、これは意味がありません:
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'
}
何か案は?
更新:
IntelliJのSpringイニシャライザーを使用してSpring Bootプロジェクトを作成するだけの簡単な再現方法で、同じ結果が得られます。
DemoApplication:
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
SpringApplication.run(DemoApplication::class.Java, *args)
}
エラー:
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')
}
IntelliJのKotlinプラグインの1.2.21へのアップグレードを修正: https://plugins.jetbrains.com/plugin/6954-kotlin/update/42501
まず第一に、それはすべてクラスKotlinによるものです クラス定義 :
クラスの
open
注釈は、Javaのfinal
の反対です。これにより、他の人がこのクラスから継承できます。デフォルトでは、Kotlinのすべてのクラスはfinalです
したがって、ソースコードを自由に変更できる場合は、次のようにopen
を署名に追加するだけで、クラスを最終的なものにできません。
@SpringBootApplication
open class DemoApplication
fun main(args: Array<String>) {
SpringApplication.run(DemoApplication::class.Java, *args)
}
またはこれに応じて可能な解決策の1つ 記事 :
@SpringBootApplication
は、@Configuration
、@EnableAutoConfiguration
および@ComponentScan
注釈でクラスをマークする便利な注釈です。 openキーワードの使用を強制するのは、@Configuration
アノテーションです。
この問題を解決するには、@SpringBootApplication
注釈を削除し、@EnableAutoConfiguration
および@ComponentScan
でクラスに注釈を付けます。
プラグインの更新が役に立たない場合は、gradleのkotlinのバージョンがideのkotlinバージョンと一致するかどうかを確認してください。
IntelliJでこのエラーが発生した場合、kotlin-springプラグインを使用している場合でも、IntelliJで注釈処理が有効になっているかどうかを確認できます。