多模块Gradle项目作为类库引入外部项目时找不到子模块依赖如何解决
问题原因
你现在遇到的报错本质是:你用maven-publish插件的from components.java生成发布用的pom文件时,Gradle会自动把父模块dependencies里声明的所有implementation依赖(包括子模块依赖)都写入pom的依赖列表。其他项目引入你的父类库时,会按照pom配置尝试拉取所有依赖,而你没有发布子模块到仓库,所以才会报找不到子模块jar的错误。
你已经在jar配置中把所有子模块的编译类都打包进了父模块jar,所以只需要把pom里的子模块依赖移除即可,不需要发布子模块。
解决方案
修改父模块build.gradle中的publishing配置,增加pom过滤逻辑,移除所有子模块的依赖声明即可,修改后的publishing块如下:
publishing { publications { mavenJava(MavenPublication) { from components.java artifactId = 'parent' // 新增以下pom修改逻辑 pom.withXml { def rootNode = asNode() // 找到pom中的dependencies节点 def dependenciesNode = rootNode.dependencies?.getAt(0) if (dependenciesNode) { // 遍历所有依赖,移除子模块相关依赖 dependenciesNode.dependency.each { depNode -> String groupId = depNode.groupId.text() String artifactId = depNode.artifactId.text() // 匹配你自己的子模块坐标规则,可根据实际情况调整 if (groupId == 'de.example' && ['child1', 'child2', 'child3'].contains(artifactId)) { depNode.replaceNode {} } } } } } } }
验证方式
修改完成后可以先执行publishToMavenLocal命令把类库发布到本地Maven仓库,打开本地仓库对应路径下的parent-1.0.0.pom文件,确认<dependencies>节点下已经没有child1、child2、child3相关的依赖声明后,再在其他本地项目依赖de.example:parent:1.0.0测试即可正常使用。
注意:这个配置只会移除子模块的依赖声明,子模块中引入的第三方依赖会正常保留在pom中,不会影响传递依赖的使用。
内容的提问来源于stack exchange,提问作者Stupe
相关产品推荐
相关产品推荐

