如何解决Gradle上传Jar到Nexus Maven仓库时POM无效及依赖排除问题?
问题根源
- 你调用
from components.java后maven-publish插件会自动生成<dependencies>节点,你又手动追加了一个相同节点,导致POM文件结构重复失效 - 你声明依赖用的是
compile配置,但遍历依赖时用了configurations.implementation,低版本Gradle下无法匹配到你声明的项目依赖 - 你手动配置的依赖
scope写了implementation,Maven标准scope没有这个值,会导致依赖无法被正常识别
修改后的pom.withXml配置
pom.withXml { // 先删除默认生成的dependencies节点,避免结构重复 def rootNode = asNode() def existingDeps = rootNode.get('dependencies') if (existingDeps != null) { existingDeps.each { rootNode.remove(it) } } // 新建唯一的dependencies节点 def dependenciesNode = rootNode.appendNode('dependencies') // 匹配你用的compile配置遍历依赖,高版本Gradle可替换为configurations.implementation configurations.compile.allDependencies.each { dep -> // 过滤排除指定的两个子项目依赖,同时跳过无效的unspecified依赖 if (dep.name != null && !"unspecified".equals(dep.name) && !["f_frame", "p_AppComm"].contains(dep.name)) { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', dep.group) dependencyNode.appendNode('artifactId', dep.name) dependencyNode.appendNode('version', dep.version) // 改用Maven支持的compile scope dependencyNode.appendNode('scope', 'compile') } } }
补充说明
- Gradle 6+版本已废弃
compile配置,建议将dependencies块中的compile统一替换为implementation,同步将上述代码中的configurations.compile改为configurations.implementation即可符合官方规范 - 后续需要新增排除依赖时,直接向
["f_frame", "p_AppComm"]数组中添加对应artifactId即可
内容的提问来源于stack exchange,提问作者keshuan_jeme
相关产品推荐
相关产品推荐

