Gradle多模块项目中如何打包内部依赖并发布SDK?
解决Gradle多模块项目打包内部依赖发布SDK的问题
问题核心
你需要将layers-sdk模块打包为包含内部依赖(如libs)的Jar包,并发布到Maven仓库,同时确保导入该SDK的项目无需依赖未发布的内部模块。之前的做法因为POM文件仍保留内部依赖引用,导致导入时出现依赖找不到的错误。
推荐方案:使用Shadow插件
Shadow插件是Gradle生态中专门用于构建包含依赖的Fat Jar的工具,能自动处理依赖打包和POM依赖排除,避免手动配置的繁琐。
1. 根项目配置插件Classpath
在项目根目录的build.gradle.kts中添加Shadow插件的依赖:
buildscript { repositories { gradlePluginPortal() } dependencies { classpath("com.github.johnrengelman.shadow:7.1.2") // 可替换为最新版本 } }
2. 配置layers-sdk模块
在layers-sdk/build.gradle.kts中应用插件并完成打包、发布配置:
plugins { id("java") id("maven-publish") id("com.github.johnrengelman.shadow") } // 配置Shadow Jar:指定要打包的内部依赖 shadowJar { dependencies { include(dependency(project(":libs"))) // 如有其他内部依赖,继续添加include(dependency(project(":xxx"))) } // 移除默认的-shadow后缀,生成标准命名的Jar包 archiveClassifier.set("") } // 配置发布:使用Shadow组件替代默认Java组件 publishing { publications { create<MavenPublication>("main") { from(components["shadow"]) // 关键:用Shadow组件输出,自动排除内部依赖的POM引用 version = scmVersion.version } } repositories { // 替换为你的Maven仓库地址 maven { url = uri("your-maven-repo-url") credentials { username = "your-username" password = "your-password" } } } }
备选方案:手动配置(不使用插件)
如果不想引入第三方插件,可以手动处理Jar打包和POM依赖移除:
1. 配置Jar任务打包内部依赖
在layers-sdk/build.gradle.kts中修改Jar任务,将内部模块的代码打包进来:
tasks.jar { // 确保先构建内部模块的Jar dependsOn(project(":libs").tasks.jar) // 将内部模块的Jar解压后合并到当前Jar from(zipTree(project(":libs").tasks.jar.get().outputs.files.singleFile)) { // 排除重复的签名文件,避免冲突 exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA") } }
2. 移除POM中的内部依赖引用
在发布配置中,手动删除POM文件里的内部依赖节点:
publishing { publications { create<MavenPublication>("main") { from(components["java"]) version = scmVersion.version pom.withXml { val dependenciesNode = asNode().get("dependencies").single() // 移除所有内部模块的依赖节点 dependenciesNode.children().removeIf { depNode -> val groupId = depNode.get("groupId").single().text() val artifactId = depNode.get("artifactId").single().text() // 匹配你的内部模块坐标,可添加多个条件处理多个依赖 groupId == "com.test.ep" && artifactId == "lib" } } } } repositories { // 配置你的Maven仓库 maven { url = uri("your-maven-repo-url") credentials { username = "your-username" password = "your-password" } } } }
验证步骤
- 执行命令
./gradlew :layers-sdk:publish完成发布 - 在外部项目中添加
layers-sdk的依赖,执行构建确认无依赖找不到的错误 - 检查发布的POM文件,确认已移除内部模块的依赖引用
内容的提问来源于stack exchange,提问作者Marcus Vinicius Bianchi Santos
相关产品推荐
相关产品推荐

