如何将本地依赖打包进Gradle构建的Jar?解决模块发布依赖缺失问题
这个问题我碰到过好多次了——本质就是你本地开发用的compile project(':shared')这种项目依赖,在发布Client之后生成的POM文件里,依然指向本地项目路径,而不是一个可被仓库解析的坐标,所以依赖Client的项目自然找不到Shared。下面是具体的解决步骤:
1. 先把Shared项目发布到仓库(本地/私有)
要让Client的依赖能被下游项目解析,首先得让Shared本身成为仓库里的可依赖构件。给Shared项目配置maven-publish插件:
在Shared的build.gradle里添加如下配置:
plugins { id 'java' id 'maven-publish' } // 给Shared定义唯一坐标,替换成你自己的 group 'com.yourteam' version '1.0.0' publishing { publications { mavenJava(MavenPublication) { // 基于Java组件发布,会自动包含编译产物和POM from components.java } } repositories { // 先发布到本地Maven仓库测试,后续可以换成私有仓库 mavenLocal() // 如果用私有仓库,取消下面注释并配置 // maven { // url = uri('https://your-private-repo-url.com') // credentials { // username = 'your-repo-username' // password = 'your-repo-password' // } // } } }
配置好后,执行命令发布Shared:
./gradlew publishToMavenLocal
(如果是发布到私有仓库,执行./gradlew publish即可)
2. 修改Client项目的依赖方式
把Client里原来的本地项目依赖,改成引用Shared的仓库坐标:
替换Client的build.gradle里的依赖声明:
// 原来的本地依赖 // compile project(':shared') // 改成仓库坐标依赖,和你给Shared定义的一致 implementation 'com.yourteam:shared:1.0.0'
这样本地开发时,Gradle会自动从本地仓库拉取Shared;发布Client时,生成的POM文件里会包含正确的依赖坐标,下游项目就能正常解析了。
3. 确保Client的Maven-Publish配置正确
最后给Client也配置好maven-publish,保证发布的产物和POM符合规范:
在Client的build.gradle里添加:
plugins { id 'java' id 'maven-publish' } // 给Client定义自己的坐标 group 'com.yourteam' version '1.0.0' dependencies { implementation 'com.yourteam:shared:1.0.0' } publishing { publications { mavenJava(MavenPublication) { from components.java } } repositories { mavenLocal() // 同样配置私有仓库如果需要 } }
执行命令发布Client:
./gradlew publishToMavenLocal
你可以去Client的build/publications/mavenJava/pom-default.xml里查看生成的POM,里面应该有一个指向com.yourteam:shared:1.0.0的<dependency>节点,而不是本地项目路径。
额外说明:如果不想发布Shared怎么办?
如果因为某些原因不能发布Shared,你可以用Shadow插件把Shared的代码打包进Client的Jar里(即Fat Jar),但这种方式不推荐——因为如果下游项目也依赖Shared,会导致重复依赖问题。如果一定要这么做,需要配置Shadow插件并在发布时指定Shadow Jar作为发布产物,不过优先推荐前面的仓库依赖方案。
内容的提问来源于stack exchange,提问作者usbpc102

