2

我正在将我的项目从 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.21.3会因为冲突而被省略,maven 会使用1.6。显然情况并非如此,因为maven 3在 war 文件中打包了commons-codec-1.3.jar

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

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

邮编:

4

1 回答 1

0

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

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

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

于 2013-10-22T07:00:40.147 回答