摆脱正在迁移到Gradle Kotlin DSL的Spring Boot项目中的警告

问题描述 投票:1回答:1

我正在将某些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的项目时也看不到任何类似的警告。

spring spring-boot gradle intellij-idea gradle-kotlin-dsl
1个回答
0
投票

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")
}
© www.soinside.com 2019 - 2024. All rights reserved.