我能够从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')
}
答案 0 :(得分:13)
首先,这完全归功于Kotlin课程class definition:
类的
CellValueChanged
注释与Java的open
相反:它允许其他人继承此类。默认情况下,Kotlin中的所有类都是最终的
因此,如果您可以自由修改源代码,则可以使您的课程不是最终的,只需将final
添加到其签名中,如下所示:
open
或其中一种可能的解决方案,根据此article:
@SpringBootApplication open class DemoApplication fun main(args: Array<String>) { SpringApplication.run(DemoApplication::class.java, *args) } }
是一个便利注释,用于标记具有@SpringBootApplication
,@Configuration
和@EnableAutoConfiguration
注释的类。@ComponentScan
注释强制使用open关键字。
尝试删除@Configuration
注释并使用@SpringBootApplication
和@EnableAutoConfiguration
注释您的课程以解决此问题。
答案 1 :(得分:2)
修正IntelliJ的Kotlin升级到1.2.21:https://plugins.jetbrains.com/plugin/6954-kotlin/update/42501
答案 2 :(得分:0)
如果插件更新无效,请检查gradle中kotlin的版本是否与ide的kotlin版本匹配。
答案 3 :(得分:0)
如果即使使用kotlin-spring插件在IntelliJ上遇到此错误,您可能要检查IntelliJ中是否已启用注释处理。
答案 4 :(得分:0)
如果您需要将默认行为开放给kotlin中所有与Spring相关的类,则可以使用
kotlin-allopen
个插件从这里
https://search.maven.org/classic/#search%7Cga%7C1%7Ckotlin%20allopen
答案 5 :(得分:0)
这为我解决了(只需将以下行添加到插件中):
plugins {
id "org.jetbrains.kotlin.plugin.spring" version "1.5.10"
}
或者这种方法:
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}
}
apply plugin: "kotlin-spring"
或者在 Maven 中:
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
对于非 Spring 应用程序,请执行以下操作:
plugins {
id "org.jetbrains.kotlin.plugin.allopen" version "1.5.10"
}
或这种方法:
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}
}
apply plugin: "kotlin-allopen"
然后指定将使类打开的注释列表
allOpen {
annotation("com.my.Annotation")
}
或者使用元注释:
@com.my.Annotation
annotation class MyFrameworkAnnotation
@MyFrameworkAnnotation
class MyClass //all-open
如何在 Maven 中使用 all-open:
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<plugin>all-open</plugin>
</compilerPlugins>
<pluginOptions>
<option>all-open:annotation=com.my.Annotation</option>
<option>all-open:annotation=com.their.AnotherAnnotation</option>
</pluginOptions>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>