无法将Gradle插件添加至Kotlin DSL的settings.gradle.kts求助
问题分析与解决方案
问题根源
你的自定义插件通过implementation依赖了org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0,当在settings.gradle.kts中应用该插件时,这个依赖会被自动添加到Settings阶段的类路径中。后续全局build.gradle.kts通过plugins块声明org.jetbrains.kotlin.android插件时,Gradle检测到类路径已存在Kotlin相关插件,但无法确定其具体版本(因为是通过自定义插件的传递依赖引入,而非标准plugins块声明),因此无法校验版本兼容性,触发报错。
解决办法
方法1:修改自定义插件的依赖范围为compileOnly
将插件中对Kotlin Gradle插件的依赖从implementation改为compileOnly,这样插件编译时能获取到API,但不会将该依赖打包到发布产物中,也就不会传递到使用项目的类路径里。
修改插件的build.gradle:
dependencies { // 替换原来的implementation为compileOnly compileOnly("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0") api("org.jfrog.buildinfo:build-info-extractor-gradle:5.2.3") testImplementation(kotlin("test")) }
修改后重新发布插件到本地Maven仓库,再在项目中使用即可。
方法2:通过Gradle插件的依赖声明机制管理插件依赖
在自定义插件的gradlePlugin块中声明对Kotlin插件的依赖,而非直接在dependencies中添加,让Gradle自动处理版本兼容性,避免传递依赖冲突。
修改插件的build.gradle:
plugins { kotlin("jvm") version embeddedKotlinVersion `maven-publish` `kotlin-dsl` } // 添加gradlePlugin块声明插件信息及依赖 gradlePlugin { plugins { create("myPlugin") { id = "my-plugin-id" implementationClass = "com.your.package.MyPluginImpl" // 替换为你的插件实现类路径 // 声明依赖的Kotlin插件 dependencies { implementation plugin("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0") } } } } repositories { mavenCentral() gradlePluginPortal() google() } dependencies { // 移除原来的kotlin-gradle-plugin依赖 api("org.jfrog.buildinfo:build-info-extractor-gradle:5.2.3") testImplementation(kotlin("test")) } kotlin { jvmToolchain(17) }
方法3:在使用项目中排除自定义插件的传递依赖
如果无法修改自定义插件代码,可以在项目的settings.gradle.kts中通过buildscript引入插件,并排除掉Kotlin Gradle插件的传递依赖:
pluginManagement { repositories { google { content { includeGroupByRegex("com\\.android.*") includeGroupByRegex("com\\.google.*") includeGroupByRegex("androidx.*") } } mavenCentral() gradlePluginPortal() mavenLocal() } } buildscript { repositories { mavenLocal() mavenCentral() gradlePluginPortal() google() } dependencies { classpath("your.group.id:my-plugin-id:1.0-SNAPSHOT") { // 排除传递的Kotlin Gradle插件依赖 exclude(group = "org.jetbrains.kotlin", module = "kotlin-gradle-plugin") } } } // 应用自定义插件 apply(plugin = "my-plugin-id")
内容的提问来源于stack exchange,提问作者Jimedem
相关产品推荐
相关产品推荐

