我正在将某些Gradle项目从Groovy迁移到Kotlin DSL。
我正在使用kotlin-dsl插件并按如下方式配置Spring Boot:
plugins {
java
id("org.springframework.boot").version(Versions.springBootVersion)
`kotlin-dsl`
}
kotlin-dsl
插件的文档要求not指定任何特定的Kotlin版本,如下所示:
避免为kotlin-dsl插件指定版本:
每个Gradle版本均应与特定版本的 kotlin-dsl插件和任意Gradle版本之间的兼容性 并且不保证kotlin-dsl插件版本。使用意外 构建中的kotlin-dsl插件版本将发出警告,并 可能会导致难以诊断的问题。
这是我的应用程序类:
@SpringBootApplication
class App {
fun main(args: Array<String>) {
runApplication<App>(*args)
}
}
在以class App
开头的行下,我在IntelliJ中看到一条警告,告诉我:
Classes annotated with '@Configuration' could be implicitly subclassed and must not be final
我知道这是因为App
类应声明为open
。据我所知,Kotlin的Gradle Spring Boot插件应该负责在幕后为我制作一个@SpringBootApplication
带注释的类open
。所以我尝试添加以下插件:
kotlin("plugin.spring") version "1.3.72"
((version "1.3.72"
对应于Kotlin版本)
并且异常消失了,正如预期的那样。但是,此方法违反了建议的准则,即不对Gradle配置中的Kotlin版本进行硬编码。
使用Kotlin DSL配置Spring Boot的最佳实践是什么,因此我不必在构建脚本中对Kotlin版本进行硬编码?也许有一种方法可以消除IntelliJ中的警告,而不必添加kotlin("plugin.spring") version "1.3.72"
插件?我认为这可能是IntelliJ特有的问题,因为即使没有kotlin("plugin.spring")
,在从终端构建或执行带有gradle的项目时也看不到任何类似的警告。
Kotlin DSL Plugin的Gradle用户指南是这样描述的:
Kotlin DSL插件提供了一种方便的方法来开发基于Kotlin的项目,这些项目有助于构建逻辑。其中包括buildSrc项目,内部版本和Gradle插件。
您的Spring Boot应用程序不提供构建逻辑,您可能不应该为此使用插件。如果您正在Kotlin中开发Gradle插件,那将更有意义。在这种情况下,您应该使用与构建版本一起提供的Kotlin DSL的Gradle API相同版本,因为定位另一个版本可能会有些棘手。
我会删除该插件,而应明确说明您的配置。您将需要在构建文件中再添加几行,但是通过这种方式,复杂类路径将不会受到您根本不需要的DSL东西的污染。
这还意味着您需要对Kotlin版本进行硬编码,但这是一件好事,因为否则您将依赖于所构建的Gradle版本中包含的任何内容。
例如:
plugins {
id("org.springframework.boot") version "2.3.0.RELEASE"
kotlin("jvm") version "1.3.72"
kotlin("plugin.spring") version "1.3.72"
}
dependencies {
implementation(platform("org.springframework.boot:spring-boot-dependencies:2.3.0.RELEASE"))
implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.springframework.boot:spring-boot-starter")
}