1

发布了一些类似的问题here.但是没有答案。为什么传递依赖不包括我的最终战争?

我多模块Maven项目

当我运行mvn dependency:tree, 我看到下面的

[INFO] ------------------------------------------------------------------------ 
[INFO] Building Service 2.2.22-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 

[INFO] +- org.apache.httpcomponents:httpclient:jar:4.3.2:compile 
[INFO] | \- commons-codec:commons-codec:jar:1.6:compile 

[INFO] ------------------------------------------------------------------------ 
[INFO] Building common 2.2.22-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] +- com.mycompany.project:jar:2.1.115:compile 
      +- commons-httpclient:commons-httpclient:jar:3.1:compile 
[INFO] | | \- commons-codec:commons-codec:jar:1.2:compile 

没有其他的配置,以排除任何库在pom.xml中完成。 在我最后的war/WEB-INF/lib

我看到commons-codec-1.6.jarcommons-httpclient-3.1.jarhttpclient-4.3.2.jar。 但我没看到commons-codec-1.2.jar。这是为什么?

回答

2

而是既包括公共编解码器罐,这可能会导致冲突和问题,Maven的dependency mediation选择commons-codec-1.6.jar

  • 依赖调解 - 这个决定将是什么版本的依赖 的在遇到多个版本的工件时使用。 目前,Maven 2.0仅支持使用“最接近定义” ,这意味着它将使用与依赖关系树中项目最接近的版本 。您可以始终通过在项目的POM中明确声明 版本来保证。请注意,如果 两个依赖项版本在依赖关系树中处于相同深度 ,直到Maven 2.0.8未定义哪一个会获胜,但自从 Maven 2.0.9它是声明中的顺序:第一个 宣告胜利。
    • “最接近的定义”意味着使用的版本 将是依赖关系树中您的项目最接近的版本,例如 。如果将A,B和C的依赖关系定义为A→B→C→D和A→E→D 1.0,则在构建A时将使用D 1.0,因为从A到D的路径通过E更短。你可以明确地 添加依赖关系到d 2.0 A至强制使用d 2.0