maven 3依赖插件 - 结果不一致

时间:2013-10-22 01:27:32

标签: maven-3 maven-dependency-plugin

我正在将我的项目从maven 2(2.2.1)迁移到maven 3(3.1.0),我遇到了jar版本的一些问题。当我试图追踪问题时,我遇到了来自依赖插件的一些不一致的结果,这让我很困惑。

当我在 maven 3

中尝试以下命令时
mvn dependency:tree -Dincludes=commons-codec

结果是:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ xxx ---
[INFO] com.xxx.yyy:zzz:war:2.6-SNAPSHOT
[INFO] \- net.sourceforge.jwebunit:jwebunit-htmlunit-plugin:jar:2.2:test
[INFO]    \- net.sourceforge.htmlunit:htmlunit:jar:2.5:test
[INFO]       \- commons-codec:commons-codec:jar:1.3:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

因此结果建议使用 commons-codec-1.3.jar 。 (maven 3在包装时确实包含commons-codec-1.3.jar。)

但是,如果我将选项(-Dverbose)添加到命令

mvn dependency:tree -Dincludes=commons-codec -Dverbose

结果将是

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ xxx ---
[INFO] com.xxx.yyy:zzz:war:2.6-SNAPSHOT
[INFO] +- net.sourceforge.jwebunit:jwebunit-htmlunit-plugin:jar:2.2:test
[INFO] |  \- net.sourceforge.htmlunit:htmlunit:jar:2.5:test
[INFO] |     +- commons-httpclient:commons-httpclient:jar:3.1:test
[INFO] |     |  \- (commons-codec:commons-codec:jar:1.2:test - omitted for conflict with 1.3)
[INFO] |     \- (commons-codec:commons-codec:jar:1.3:compile - scope updated from test; omitted for duplicate)
[INFO] \- xxx.yyy.zzz.core:www-core:jar:2.6-SNAPSHOT:compile
[INFO]    +- org.apache.httpcomponents:httpclient:jar:4.2.2:compile
[INFO]    |  \- commons-codec:commons-codec:jar:1.6:compile
[INFO]    \- xxx.yyy.zzz.security:datasecurity:jar:2.0:compile
[INFO]       \- (commons-codec:commons-codec:jar:1.3:compile - omitted for conflict with 1.6)
[INFO] ------------------------------------------------------------------------

第二个结果表明,由于冲突,版本 1.2 1.3 将被省略,而maven将使用 1.6 。显然情况并非如此,因为 maven 3 在war文件中打包了 commons-codec-1.3.jar

为什么maven 3中的插件在两种情况下表示不同的依赖关系(它不应该像-Dverbose应该只显示哪些依赖项被省略以及为什么)?这是一个错误还是我错过了什么?

值得注意的是, maven 2 将打包 commons-codec-1.6.jar

P / S:

1 个答案:

答案 0 :(得分:0)

Maven总是最接近的依赖that match,在这种情况下,1.2,1.3和1.6具有相同的深度:3。所以Maven必须选择其中一个并且需要1.6。

您可以通过直接在模块pom.xml 中添加依赖项来强制执行给定的依赖项版本,这将使其处于第一级深度并强制使用maven它与你定义的版本。

此外,对于我来说,您希望版本1.2,因为它是测试依赖项(commons-httpclient:commons-httpclient:jar:3.1: test )的传递依赖,这似乎很奇怪永远不应该打包。