Gradle为何强制指定Kotlin版本?如何自定义指定?
问题背景
我有一个简单的Gradle项目,初始配置如下:
plugins { kotlin("jvm") }
使用不同Gradle版本运行时,关联的Kotlin版本不同:
$ ./gradlew wrapper --gradle-version=7.5 $ ./gradlew --version Kotlin: 1.6.21 $ ./gradlew wrapper --gradle-version=7.4.2 $ ./gradlew --version Kotlin: 1.5.31 $ ./gradlew wrapper --gradle-version=7.2 $ ./gradlew --version Kotlin: 1.5.21
可见Gradle会自动决定Kotlin插件的版本。
我希望自行指定Kotlin版本,于是修改配置:
plugins { kotlin("jvm") version "1.6.10" }
但Gradle报错:
Plugin request for plugin already on the classpath must not include a version
我已检查项目,未在其他地方显式定义Gradle版本。
额外问题解答
为什么Gradle会自动决定Kotlin插件版本?
Gradle这么做是为了保证兼容性:Kotlin插件与Gradle本身存在紧密依赖,不同版本的Gradle对Kotlin的API支持程度不同。官方会预先测试并绑定经过验证的Kotlin版本,避免用户因版本不匹配出现兼容性问题,同时简化项目配置流程。
版本对应关系有官方文档吗?
有的,Gradle官方维护了Kotlin插件与Gradle版本的对应表,涵盖每个Gradle版本默认绑定的Kotlin版本,以及支持的最低/最高Kotlin版本范围。
核心问题:如何指定自定义Kotlin版本?
你遇到的报错是因为通过kotlin("jvm")引入插件时,Gradle已经通过默认绑定机制把对应版本的插件放到了类路径中,此时再显式添加version会引发冲突。以下是三种可行的解决方法:
方法1:通过全局属性指定
在项目根目录的gradle.properties文件中添加:
kotlin.version=1.6.10
该配置会覆盖Gradle默认的Kotlin版本,所有Kotlin相关插件都会统一使用这个版本。
方法2:用版本解析策略强制指定
在项目的settings.gradle.kts(Groovy项目用settings.gradle)中添加版本解析规则:
pluginManagement { resolutionStrategy { eachPlugin { if (requested.id.namespace == "org.jetbrains.kotlin") { useVersion("1.6.10") } } } }
这种方式更灵活,可单独针对Kotlin插件指定版本,不影响其他插件的默认配置。
方法3:显式声明完整插件ID与版本
修改build.gradle.kts,使用完整的插件ID替代简化写法,避免触发Gradle的默认版本绑定:
plugins { id("org.jetbrains.kotlin.jvm") version "1.6.10" }
内容的提问来源于stack exchange,提问作者user8681

