来自maven依赖项的输出:树,哪个版本将覆盖

时间:2014-11-22 19:51:31

标签: maven maven-dependency-plugin

这是mvn dependency:tree

的输出

检查kafka的依赖关系。

我看到它出现在两个地方,想知道在运行应用程序时会发挥哪种依赖。

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ suite ---
[INFO] com.company.foo.qe:suite:jar:2.8.0-SNAPSHOT
[INFO] +- org.apache.kafka:kafka_2.11:jar:0.8.2-V3-PATCH:compile
[INFO] |  +- org.scala-lang.modules:scala-xml_2.11:jar:1.0.2:compile
[INFO] |  +- com.yammer.metrics:metrics-core:jar:2.2.0:compile
[INFO] |  +- net.sf.jopt-simple:jopt-simple:jar:3.2:compile
[INFO] |  +- org.scala-lang.modules:scala-parser-combinators_2.11:jar:1.0.2:compile
[INFO] |  +- org.scala-lang:scala-library:jar:2.11.2:compile
[INFO] |  +- org.apache.kafka:kafka-clients:jar:0.8.2-V3-PATCH:compile
[INFO] |  |  \- net.jpountz.lz4:lz4:jar:1.2.0:compile
[INFO] +- com.company.foo:ec:jar:2.8.0-SNAPSHOT:compile
[INFO] |  +- com.company.foo:solr:jar:2.8.0-SNAPSHOT:compile
[INFO] |  +- org.apache.kafka:kafka_2.10:jar:0.8.1.1:compile

1 个答案:

答案 0 :(得分:3)

来自文档:“默认情况下,Maven将解决与最近赢方法的冲突”[Resolving Conflicts]。这转换为选择org.apache.kafka:kafka_2.11:jar:0.8.2-V3-PATCH:在您的示例中编译。另请参阅Transitive Dependencies

最近 - 获胜方法只选择Maven依赖关系树输出中最靠近左侧的依赖项版本。此方法根据它们与pom.xml依赖项声明的接近程度来选择依赖项。如果您在pom中明确声明依赖 conflicting-2.0 ,那么依赖将是Maven选择的依赖项。如果您声明依赖 B 依赖于冲突-1.0 ,那么冲突-1.0 将被视为远离 >依赖项中的> conflicting-2.0

举例说明:

  [INFO] +- conflicting-2.0    (dependency declared in your pom, level 0)       
  [INFO] +- B                  (dependency declared in your pom, level 0) 
  [INFO] |  \- conflicting-1.0 (dependency declared in B,        level 1) 

在这种情况下,Maven会选择Conflicting-2.0作为依赖项的正确版本,因为它是在项目pom中明确声明的。

可以肯定的是,您可以使用-Dverbose标志(mvn dependency:tree -Dverbose)调用依赖关系树,maven将告诉您未选择哪个jar:

 \- (org.apache.kafka:kafka_2.10:jar:0.8.1.1:compile - omitted for conflict with 2.11)