我正在将我的项目从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:
答案 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 )的传递依赖,这似乎很奇怪永远不应该打包。