多模块Android项目中混用不同版本Kotlin的解决方案咨询
解决多模块Android项目中Kotlin插件版本冲突问题
问题核心
根Gradle脚本通过apply:false引入了Kotlin 1.9.20的Android插件,导致全局构建类路径中存在该版本插件;目标app模块尝试引入Kotlin 2.1.0版本的同名插件时,Gradle因不允许同一ID插件多版本共存而报错。
步骤1:修复版本目录的重复别名
你的libs.versions.toml中存在重复的kotlin-android别名,会导致版本被覆盖,先修改为:
kotlin = "1.9.20" kotlin-v2 = "2.1.0" [plugins] # 基础版本(供大部分模块使用) kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } # V2版本(供目标app模块使用) kotlin-android-v2 = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-v2" } kotlin-serialization-v2 = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin-v2" } kotlin-parcelize-v2 = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin-v2" }
步骤2:移除根脚本中的全局插件声明
打开根目录build.gradle.kts,删除所有Kotlin相关的apply false插件声明,包括:
alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.kotlin.parcelize) apply false
这些声明会将指定版本的Kotlin插件加入全局构建类路径,直接导致版本冲突。根脚本中的ktlint、detekt等插件无需依赖这些Kotlin插件,可正常运行。
步骤3:为目标模块配置独立插件版本
修改目标app模块(:apps:test)的build.gradle.kts,使用V2版本的插件别名:
plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android-v2) alias(libs.plugins.kotlin.serialization-v2) alias(libs.plugins.kotlin.parcelize-v2) }
可选:通过pluginManagement精准控制版本(替代步骤2)
如果需要保留根脚本中的部分Kotlin插件声明,可以在settings.gradle.kts的pluginManagement块中添加版本解析策略,为特定模块指定插件版本:
pluginManagement { repositories { mavenLocal() google() mavenCentral() gradlePluginPortal() } resolutionStrategy { eachPlugin { if (requested.id.id == "org.jetbrains.kotlin.android" || requested.id.id.startsWith("org.jetbrains.kotlin.plugin.")) { val targetModule = ":apps:test" useVersion(if (project.path == targetModule) "2.1.0" else "1.9.20") } } } }
该策略会根据模块路径自动匹配对应的Kotlin插件版本,避免全局类路径冲突。
注意事项
- 目标模块中Kotlin标准库版本会自动与插件版本关联,无需手动额外配置。
- 若模块间存在依赖,需测试高版本Kotlin编译的代码是否兼容低版本Kotlin模块(Kotlin跨版本兼容性较好,但建议覆盖核心依赖路径测试)。
内容的提问来源于stack exchange,提问作者Javad
相关产品推荐
相关产品推荐

