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



我正在将我的项目从 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 在战争文件中打包了 commons-codec-1.3.jar

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

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

P/s:

  • 从 Maven 依赖插件的 2.5 版开始,dependency:tree 可与 Maven 3 - Maven3 - 如何找到依赖解析一起使用?( MVN depedency:树不适用于 MVN3 )
  • verbose:是否在序列化依赖项树中包含省略的节点。 - http://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html

Maven 始终是最接近匹配的依赖项,在这种情况下,1.2、1.3 和 1.6 具有相同的深度级别: 3. 所以 Maven 必须选择其中一个并取 1.6。

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

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

最新更新