发布了一些类似的问题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.jar
,commons-httpclient-3.1.jar
,httpclient-4.3.2.jar
。
但我没有看到commons-codec-1.2.jar
。那是为什么?
答案 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