为何Gradle发布的pom文件会存在自引用依赖问题
问题1解答
自引用依赖完全不符合Maven POM规范。循环依赖会直接导致Maven依赖解析失败,Nexus的合规性校验就是为了拦截这类错误配置才会返回发布失败。
Gradle本身只负责根据用户配置的依赖规则生成POM文件,不会额外对生成的内容做业务合理性校验,所以只要你配置的依赖列表里包含自身坐标,Gradle就会直接写入POM,不会主动拦截这类异常内容。
问题2解答
自引用依赖的常见生成原因有三类:
- 最常见的是Scala插件
crossVersion配置错误,你项目的artifactId是splain_2.13.6,属于拼接了Scala版本后的跨版本制品坐标,如果你的依赖声明里用了错误的匹配规则,把自身坐标匹配进了编译依赖集,就会出现这个问题。 - 其次是你可能在依赖块里错误声明了和自身groupId、artifactId、版本完全一致的依赖,或者错误把同名子模块的制品当成第三方依赖引入。
- 还有一种情况是打包/发布插件配置错误,比如shadow、assembly插件错误把自身制品加入了需要导出的依赖列表。
修复方案
你可以先通过发布配置手动过滤自引用依赖快速解决问题,示例配置如下:
publishing { publications { create<MavenPublication>("maven") { from(components["java"]) pom.withXml { val dependenciesNode = asNode().get("dependencies") as groovy.util.NodeList if (dependenciesNode.isNotEmpty()) { (dependenciesNode.first() as groovy.util.Node).iterator().forEach { dep -> dep as groovy.util.Node val groupId = dep.get("groupId").first().text() val artifactId = dep.get("artifactId").first().text() val version = dep.get("version").first().text() if (groupId == project.group.toString() && artifactId == project.name && version == project.version.toString() ) { dep.parent().remove(dep) } } } } } } }
另外你提到的provided scope废弃问题,Gradle已经用compileOnly+runtimeOnly替代了原来的provided scope,你可以把scala-compiler的依赖声明为compileOnly,就会对应生成provided scope,避免像现在这样被错误声明为runtime scope。
内容的提问来源于stack exchange,提问作者tribbloid
相关产品推荐
相关产品推荐

