web-dev-qa-db-ja.com

IntelliJ Idea 2017.3はKotlin Spring Boot Appを起動できません-@Configurationクラスは最終的なものではない可能性があります

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

IntelliJのKotlinプラグインの1.2.21へのアップグレードを修正: https://plugins.jetbrains.com/plugin/6954-kotlin/update/42501

2
codependent

まず第一に、それはすべてクラス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でクラスに注釈を付けます。

15
Stanislav

プラグインの更新が役に立たない場合は、gradleのkotlinのバージョンがideのkotlinバージョンと一致するかどうかを確認してください。

0
Teimuraz

IntelliJでこのエラーが発生した場合、kotlin-springプラグインを使用している場合でも、IntelliJで注釈処理が有効になっているかどうかを確認できます。

0
BhathiyaW