2017-04-10 141 views
0

我想(必須)使用兩個Maven依賴關係「Y」和「G」彼此相鄰,而它們與不同版本共享相同的依賴關係。 默認情況下,舊版本將被新版本覆蓋。然而,這會破壞性能。 如何分離這兩個依賴關係並確保它們使用它們的適當依賴關係?Maven:如何處理衝突的依賴關係

enter image description here

+0

'它們與X的不同版本共享相同的依賴關係? – Vishrant

+0

Y和G是否在OSGi容器內運行?如果沒有,這是不可能的...與軟件我假設你的意思是圖書館? – khmarbaise

+0

@Vishrant如圖所示,我的項目是X,classpath中有兩個版本的工件Z. – Daniel

回答

1

默認行爲,舊版本將會被新的所覆蓋。

這是不正確的。默認情況下,Maven在解決相同依賴關係的衝突版本時使用最接近的定義策略。它不一定需要新版本。這意味着由依賴關係樹中較高級別的POM聲明的版本將覆蓋在較低級別的POM中聲明的版本。如果兩個版本處於同一級別,就像圖中的情況一樣,首先聲明的版本將被採用。

迫使依賴特定版本的最好方法是顯式定義在父POM一個dependency一個dependencyManagement段內:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>groupId-z</groupId> 
      <artifactId>dependency-z</artifactId> 
      <version>1.0</version> 
     </dependency> 
    ... 

然後,所有子項目和他們的依賴將自動使用指定版本。

有關Maven中相關性衝突解決方案的更多詳細信息,請參閱this page

+0

我明確提到過,我不希望所有的依賴項(這裏是Y和G)使用第三個庫(這裏是Z)的相同版本。相反,我希望每個人都使用它的正確版本。 – Daniel

+0

除非您採取變通方法,否則這根本無法實現。如果類共享相同的包,它可能會導致類不兼容問題。最近我可以找到相關的是http://stackoverflow.com/questions/27147660/maven-project-depending-on-two-versions-of-the-same-artifact。 – manouti

0

假設「X」是一個依賴於Y和G的模塊,那麼答案取決於它如何運行。例如:如果X是一個包含Y和G的WAR,那麼您將無法擁有兩個不同版本的相同依賴關係,否則您將遇到類加載問題。

難道你不能在他們獨立使用的時候明確地爲他們自己的POM中的Y和G聲明正確的版本,但是當它們被並排使用時,將它覆蓋到必要的共享版本上嗎?