Kotlin多模块Gradle项目依赖配置问题求助
解决Kotlin Gradle项目模块依赖的仓库同步与插件冲突问题
我有如下结构的Kotlin Gradle项目:
┌Top Kotlin Project │ ├── Project1 │ │ │ ├── ModuleA1 (依赖C1) │ ├── ModuleA2 │ ├── ModuleA3 │ └── settings.gradle ├── ModuleB1 (依赖C1) ├── ModuleC1 (库模块) └── settings.gradle
ModuleA1、A2、A3、B1是独立应用模块,ModuleC1是共享库。原本用implementation(project(":ModuleC1"))依赖,但遇到两个问题:
- 所有依赖C1的模块都要配置C1的依赖仓库,C1变更时需同步修改多个构建文件;
- Kotlin插件版本冲突:C1和依赖它的模块都声明插件时出现
Plugin request for plugin already on the classpath must not include a version错误,去掉C1的插件声明则C1无法单独构建。
希望找到方案:既能独立开发ModuleC1,又能让其他模块像使用普通第三方包一样依赖它。
最优方案:将ModuleC1发布到本地Maven仓库
通过把C1发布到本地Maven仓库,其他模块直接用Maven坐标依赖,彻底解决依赖同步和插件冲突问题。
1. 配置ModuleC1支持发布到本地Maven
修改ModuleC1的build.gradle.kts,添加maven-publish插件并配置发布规则:
plugins { kotlin("jvm") version "1.6.20" `java-library` `maven-publish` // 新增发布插件 } group = "org.test.project" version = "0.1" repositories { mavenCentral() } dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1") } tasks.getByName<Test>("test") { useJUnitPlatform() } // 配置发布到本地Maven仓库 publishing { publications { create<MavenPublication>("maven") { from(components["java"]) } } }
执行./gradlew publishToMavenLocal即可将C1发布到本地Maven仓库(默认路径:~/.m2/repository)。
2. 统一管理插件版本解决冲突
在顶层项目和Project1的settings.gradle.kts中添加pluginManagement,统一所有模块的插件版本,避免版本冲突:
顶层项目settings.gradle.kts:
pluginManagement { plugins { kotlin("jvm") version "1.6.20" `java-library` `maven-publish` } repositories { gradlePluginPortal() mavenCentral() } } include(":ModuleB1", ":ModuleC1")
Project1的settings.gradle.kts:
pluginManagement { plugins { kotlin("jvm") version "1.6.20" `java-library` } repositories { gradlePluginPortal() mavenCentral() } } include(":ModuleA1", ":ModuleA2", ":ModuleA3")
之后所有模块的plugins块中无需再指定插件版本,直接引用即可:
plugins { kotlin("jvm") application // 应用模块添加这个 }
3. 修改依赖模块的引用方式
在ModuleA1和ModuleB1的build.gradle.kts中,替换项目依赖为Maven坐标,并添加本地Maven仓库:
plugins { kotlin("jvm") application } repositories { mavenCentral() mavenLocal() // 新增本地Maven仓库 } dependencies { // 替换project依赖为Maven坐标 implementation("org.test.project:ModuleC1:0.1") // 其他业务依赖... } application { mainClass.set("你的主类全路径") }
使用流程
- 独立开发ModuleC1时,修改代码后执行
./gradlew publishToMavenLocal,将最新版本发布到本地仓库; - 依赖模块构建时,会自动从本地Maven仓库拉取C1的最新版本,无需同步修改构建文件;
- 开发阶段可以将C1的版本改为
0.1-SNAPSHOT,这样每次发布都会覆盖快照版本,无需频繁修改版本号,执行./gradlew --refresh-dependencies即可更新依赖。
内容的提问来源于stack exchange,提问作者FChris
相关产品推荐
相关产品推荐

