这是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
答案 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)