场景:我的项目启用了 maven-enforcer-plugin dependencyConvergence 规则。它依赖于一个通过使用 dependencyManagement 声明纠正了自己的依赖收敛的库,但它似乎不会影响下游依赖版本的解析。
我正在谈论的错误消息类型的示例(请注意,两个版本都是作为模块d
下的传递依赖项继承的c
):
Dependency convergence error for org.apache.commons:commons-lang3:3.0 paths to dependency are:
+-com.example:d:1.0-SNAPSHOT
+-com.example:c:1.0-SNAPSHOT
+-com.example:b:1.0-SNAPSHOT
+-org.apache.commons:commons-lang3:3.0
and
+-com.example:d:1.0-SNAPSHOT
+-com.example:c:1.0-SNAPSHOT
+-org.apache.commons:commons-lang3:3.1
mvn dependency:tree
显示出类似的不一致。c
管理传递版本:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ c ---
[INFO] com.example:c:jar:1.0-SNAPSHOT
[INFO] +- com.example:b:jar:1.0-SNAPSHOT:compile
[INFO] | \- (org.apache.commons:commons-lang3:jar:3.1:compile - version managed from 3.0; omitted for duplicate)
[INFO] \- org.apache.commons:commons-lang3:jar:3.1:compile
但d
将其显示为冲突:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ d ---
[INFO] com.example:d:jar:1.0-SNAPSHOT
[INFO] \- com.example:c:jar:1.0-SNAPSHOT:compile
[INFO] +- com.example:b:jar:1.0-SNAPSHOT:compile
[INFO] | \- (org.apache.commons:commons-lang3:jar:3.0:compile - omitted for conflict with 3.1)
[INFO] \- org.apache.commons:commons-lang3:jar:3.1:compile
这似乎是一个潜在的无穷无尽的问题。如果我使用 中的dependencyManagement 更正它d
,那么我只是将问题推到下游的任何消费者身上d
。c
我可以通过在项目的 pom中排除传递依赖来避免错误,但这就是为什么我在c
!
我认为这是 Maven 中的错误,或者可能是强制插件中的错误。我错过了什么吗?处理这种情况的正确方法是什么?
这是http://jira.codehaus.org/browse/MNG-3038的案例(自 2007 年开放!)?就我而言,依赖项在整个过程中随处可见。