IntelliJ Idea 2017.3无法启动Kotlin Spring Boot App - @Configuration类可能不是最终版

cod*_*ent 15 spring intellij-idea gradle kotlin spring-boot

我能够从IntelliJ 2017.3推出Spring Boot Kotlin应用程序.在最后一次IntelliJ修复更新后,我无法从IDE启动该应用程序,获得此异常:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: @Configuration class 'AccessConfig' may not be final
Run Code Online (Sandbox Code Playgroud)

我可以像往常一样从终端开始: 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'
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

更新:

一种更简单的重现方法,只需使用IntelliJ的Spring初始化程序创建一个Spring Boot项目,您将看到相同的结果:

DemoApplication:

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
    SpringApplication.run(DemoApplication::class.java, *args)
}
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

的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')
}
Run Code Online (Sandbox Code Playgroud)

Sta*_*lav 19

首先,这完全归功于Kotlin 类的定义:

open类的注释与Java相反final:它允许其他人继承此类.默认情况下,Kotlin中的所有类都是最终的

因此,如果您可以自由修改源代码,则可以使您的课程不是最终的,只需添加open其签名如下:

@SpringBootApplication
open class DemoApplication

fun main(args: Array<String>) {
    SpringApplication.run(DemoApplication::class.java, *args)
}
Run Code Online (Sandbox Code Playgroud)

或者根据这篇文章可能的解决方案之一:

@SpringBootApplication是一个方便的注释,标记与类@Configuration,@EnableAutoConfiguration@ComponentScan注释.正是@Configuration注释强制使用open关键字.

是设法去除@SpringBootApplication与注释和批注类@EnableAutoConfiguration@ComponentScan解决这个问题.

  • 由于在 gradle.build 中应用了这个插件,它可以正常工作:`apply plugin: 'kotlin-spring'`。它正在打开每个用@Configuration 等注释的 Kotlin 类。事实上,当我使用 java -jar 运行应用程序时它可以工作,这意味着实际上是在打开这些类。但是 IntelliJ 似乎并没有应用它。 (2认同)

cod*_*ent 5

修复了将 IntelliJ 的 Kotlin 插件升级到 1.2.21 的问题:https://plugins.jetbrains.com/plugin/6954-kotlin/update/42501