2012-03-21 170 views
15

我剛剛經歷了兩個具有兩個不同版本的特定傳遞依賴項的maven項目的兩個直接依賴項的情況。Maven - 檢測多個版本的相同依賴關係

在我的具體情況我有以下直接依賴關係:

<dependency> 
     <groupId>org.jclouds.driver</groupId> 
     <artifactId>jclouds-sshj</artifactId> 
     <version>${jclouds.version}</version> 
    </dependency> 

<dependency> 
     <groupId>org.mule.modules</groupId> 
     <artifactId>mule-module-jersey</artifactId> 
     <version>${mule.version}</version> 
    </dependency> 

這兩個依賴對com.sun.jersey一(深)傳遞依賴:球衣核心,但每個版本都有不同的版本。 Maven並沒有失敗,甚至沒有發出警告(或者如果是這樣,我從來沒有看到它!)這樣的事情正在發生...因此,我直到調試發生在澤西版本的問題時才注意到它,由jclouds依賴引入的核心導致了一些破壞。

是否有Maven插件或其他存在的工具可以檢測到這種深層傳遞依賴覆蓋,並且至少在檢測到這種衝突時警告用戶(或者未能執行Maven),即使默認的maven行爲只是選擇解決依賴關係時出現的第一個版本?

回答

24

使用Dependency Enforcer插件。當依賴關係不正確收斂時,它將停止構建。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.0.1</version> 
    <executions> 
     <execution> 
     <id>enforce</id> 
     <configuration> 
      <rules> 
      <DependencyConvergence /> 
      </rules> 
     </configuration> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
+0

這似乎正是我正在尋找的。我沒有想過爲此檢查執行插件。 – whaley 2012-03-21 12:22:29

3

你可以運行depenency報告或使用依賴樹:

MVN依賴性:樹-Dverbose -Dincludes =公地集合

2

你可以只看看你dependency hiercharchy概述。這不會警告你,但是你可以看到某些版本是否被新版本的相同庫丟棄。

+0

你指的是運行依賴關係:指定爲詳細指定爲@DmitryB的樹? – whaley 2012-03-21 01:37:14

1

您可以通過從適當的依賴項中排除不需要的版本來解決版本衝突。例如:

<dependency> 
    <groupId>org.jclouds.driver</groupId> 
    <artifactId>jclouds-sshj</artifactId> 
    <version>${jclouds.version}</version> 
    <exclusions> 
     <exclusion> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-core</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

或者您將com.sun.jersey:jersey-core與所需版本添加到您的依賴項中。 Maven通過支持最接近依賴項根的依賴來解決版本confilicts。

+0

我知道如何解決問題。我想要的是Maven告訴我,開始時存在一個*潛在*問題。 – whaley 2012-03-21 12:19:48

4

@Clement P爲您提供了一個非常好的答案。但請注意,它可能不足以滿足多模塊項目。

執行者插件的depedndencyconvergence目標知道如何檢測傳遞依賴衝突,但碰撞可能以不同的方式隱藏自身。

假設您有一個多模塊項目。根是A,它有兩個子模塊B1和B2。

B1聲明上工件一個的依賴關係:B:C:1.1,而B2聲明上工件一個依賴性的:B:C:2.0

在這種情況下,如果兩個模塊是按照它們的依賴關係來構建和部署的 - 你會遇到衝突,但這是執行者插件不知道如何檢測的。由於項目A沒有(不能)依賴於它的子模塊。

爲了克服組織中的這個問題,我們使用了dependency:list插件並手動分析了它的輸出。

過程的粗略描述:運行此目標的輸出是項目層次結構中所有項目的所有傳遞依賴項的列表。我們除了解析輸出,排序依賴關係並僅搜索那些僅由版本ID而不同的工件。這需要在您的CI env中進行一些腳本編寫,但這是現在獲得整體情況的唯一方法。