2014-11-22 117 views
1

以下是mvn依賴關係的輸出:樹從maven依賴關係輸出:樹,哪個版本將被覆蓋

檢查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 

回答

3

從文檔:「默認情況下,Maven將用最近贏得的方法解決衝突」[Resolving Conflicts]。這轉換爲在您的示例中編譯org.apache.kafka:kafka_2.11:jar:0.8.2-V3-PATCH:compile。另請參閱Transitive Dependencies

最接近的方法只是選擇最靠近Maven依賴關係樹輸出中左側的依賴項的版本。這種方法基於它們與你的pom.xml依賴聲明有多接近來選擇一個依賴。如果你在你的pom中明確聲明依賴關係衝突-2.0,那麼依賴性將是Maven挑選的依賴項。如果你聲明依賴而這又取決於衝突的-1.0,然後衝突的-1.0會被認爲是漸行漸遠的是的衝突的-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會選擇衝突的-2.0的正確版本的依賴,因爲它是在項目POM顯式聲明。

可以肯定的,你可以調用依賴關係樹與-Dverbose標誌(mvn dependency:tree -Dverbose)和行家會告訴你哪個罐子是不是挑:

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

謝謝你,雙謝謝你的-Dverbose提示! – user2250246 2014-11-22 20:55:52

+0

雖然有一個問題,我沒有看到版本是如何取得最接近的勝利。離它最近的是什麼? – user2250246 2014-11-22 20:57:31

+1

我已經更新了我的答案,試圖解釋。 – fabiim 2014-11-22 21:55:18