为什么传递依赖不包括在我的最后战争中?

时间:2015-06-19 22:57:44

标签: tomcat maven-3 dependency-management transitive-dependency

发布了一些类似的问题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。那是为什么?

1 个答案:

答案 0 :(得分: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   2.0和A - > E - > D 1.0,然后在构建A时将使用D 1.0,因为从A到D到E的路径更短。你可以   明确地向A中的D 2.0添加依赖项以强制使用D 2.0
    •   
  •