如何配置多模块Gradle项目,发布到本地Maven仓库后全模块可用?
1. 先把模块间的依赖配置对
得保证ModuleA已经正确声明了对ModuleB、ModuleC的依赖,同时ModuleC也要声明对ModuleD的依赖,这样Gradle才能识别清楚模块间的层级关系。
在ModuleA的build.gradle(或build.gradle.kts)里加这些配置:
// Groovy写法 dependencies { implementation project(':ModuleB') implementation project(':ModuleC') }
// Kotlin写法 dependencies { implementation(project(":ModuleB")) implementation(project(":ModuleC")) }
ModuleC的build.gradle里也要加对ModuleD的依赖:
dependencies { implementation project(':ModuleD') }
dependencies { implementation(project(":ModuleD")) }
2. 统一配置发布插件和模块信息
首先在根项目的settings.gradle(或settings.gradle.kts)里确保所有模块都被包含进来:
// Groovy写法 include ':ModuleA', ':ModuleB', ':ModuleC', ':ModuleD'
// Kotlin写法 include(":ModuleA", ":ModuleB", ":ModuleC", ":ModuleD")
然后在根项目的build.gradle里统一配置Maven发布插件,不用每个模块单独写,省事儿:
// Groovy写法,根build.gradle subprojects { apply plugin: 'java-library' apply plugin: 'maven-publish' group = '你的组名' // 比如com.example version = '1.0.0' // 自己填版本号 publishing { publications { maven(MavenPublication) { from components.java } } } }
// Kotlin写法,根build.gradle.kts subprojects { apply(plugin = "java-library") apply(plugin = "maven-publish") group = "你的组名" version = "1.0.0" publishing { publications { create<MavenPublication>("maven") { from(components["java"]) } } } }
3. 让子模块依赖自动传递到主模块的POM里
当ModuleA依赖子模块时,Gradle默认会在ModuleA的POM文件里加上这些子模块的依赖条目,但得保证所有子模块都被发布到本地Maven仓库。执行publishToMavenLocal的时候,所有子模块都会一起发布,这样消费项目引入ModuleA时,会自动拉取ModuleB、ModuleC、ModuleD的依赖。
如果想让子模块的公开API能在消费项目里直接用,别用implementation,换成api来声明依赖,比如ModuleA里这么写:
dependencies { api project(':ModuleB') api project(':ModuleC') }
这样消费项目不用单独引入子模块,就能直接用它们的类。
4. 消费项目的配置
消费项目只需要引入ModuleA的依赖就行,因为ModuleA的POM已经包含了所有子模块的依赖,Gradle会自动解析并把这些子模块拉进来:
// Groovy写法,消费项目build.gradle dependencies { implementation '你的组名:ModuleA:1.0.0' }
// Kotlin写法,消费项目build.gradle.kts dependencies { implementation("你的组名:ModuleA:1.0.0") }
5. 验证一下发布结果
执行完publishToMavenLocal后,去本地Maven仓库(默认是~/.m2/repository)里看看每个模块的pom.xml,确认ModuleA的pom里有ModuleB和ModuleC的依赖,ModuleC的pom里有ModuleD的依赖。这样消费项目就能通过引入ModuleA,直接用所有子模块的类和外部依赖了。
内容的提问来源于stack exchange,提问作者manabreak

