在迁移到Gradle Kotlin DSL的Spring Boot项目中消除警告

在迁移到Gradle Kotlin DSL的Spring Boot项目中消除警告,spring,spring-boot,gradle,intellij-idea,gradle-kotlin-dsl,Spring,Spring Boot,Gradle,Intellij Idea,Gradle Kotlin Dsl,我正在将某些Gradle项目从Groovy迁移到Kotlin DSL 我使用的插件和配置SpringBoot如下: plugins { java id("org.springframework.boot").version(Versions.springBootVersion) `kotlin-dsl` } kotlin dsl插件的文档要求不要指定任何特定的kotlin版本,如下所述: 避免为kotlin dsl插件指定版本: 每个Gradle版本都要与特定版本的 k

我正在将某些Gradle项目从Groovy迁移到Kotlin DSL

我使用的插件和配置SpringBoot如下:

plugins {
    java
    id("org.springframework.boot").version(Versions.springBootVersion)
    `kotlin-dsl`
}
kotlin dsl
插件的文档要求不要指定任何特定的kotlin版本,如下所述:

避免为kotlin dsl插件指定版本:

每个Gradle版本都要与特定版本的 kotlin dsl插件和任意Gradle版本之间的兼容性 kotlin dsl插件版本也不保证。使用意外的 构建中的kotlin dsl插件版本将发出警告和警告 可能导致难以诊断的问题

这是我的应用课程:

@SpringBootApplication
class App {
    fun main(args: Array<String>) {
        runApplication<App>(*args)
    }
}
我知道这是因为
App
类应该声明为
open
。 据我所知,Kotlin的Gradle Spring Boot插件应该负责在幕后为我制作一个
@SpringBootApplication
注释类
open
。因此,我尝试添加以下插件:

kotlin(“plugin.spring”)版本“1.3.72”

(其中
版本“1.3.72”
对应于Kotlin版本)

正如预期的那样,例外情况消失了。 但是,这种方法违反了建议的指南,即不在Gradle配置中硬编码Kotlin版本

使用Kotlin DSL配置Spring引导的最佳实践是什么,这样我就不必在构建脚本中硬编码Kotlin版本了? 也许有一种方法可以消除IntelliJ中的警告,而不必添加
kotlin(“plugin.spring”)版本“1.3.72”
plugin?
我认为这可能是IntelliJ特有的问题,因为在从终端使用gradle构建或执行项目时,即使不存在
kotlin(“plugin.spring”)
,我也看不到任何类似的警告。

的gradle用户指南如下所述:

Kotlin DSL插件提供了一种方便的方法来开发基于Kotlin的项目,这些项目有助于构建逻辑。这包括buildSrc项目、包含的构建和Gradle插件

您的Spring Boot应用程序不提供构建逻辑,您可能不应该为此使用插件。如果您在Kotlin中开发Gradle插件,那么它将更有意义。在这种情况下,您应该针对Kotlin DSL的Gradle API的同一版本工作,该版本由您正在构建的版本提供,因为针对另一个版本可能有点棘手

我会删除插件,而不是明确说明您的配置。您将需要在构建文件中多放几行代码,但这样复杂的类路径就不会被您根本不需要的DSL内容所污染

这也意味着您需要硬编码Kotlin版本,但这是一件好事,否则您将依赖于正在构建的Gradle版本中包含的任何内容

例如:

插件{
id(“org.springframework.boot”)版本“2.3.0.RELEASE”
kotlin(“jvm”)版本“1.3.72”
kotlin(“plugin.spring”)版本“1.3.72”
}
依赖关系{
实现(平台(“org.springframework.boot:springboot依赖项:2.3.0.RELEASE”))
实施(平台(“org.jetbrains.kotlin:kotlin bom”))
实现(“org.jetbrains.kotlin:kotlin-stdlib-jdk8”)
实现(“org.springframework.boot:springbootstarter”)
}
Classes annotated with '@Configuration' could be implicitly subclassed and must not be final