2014-01-30 178 views
1

我的項目依賴於第三方庫的關係在我的POM定義如下:解決Maven的傳遞依賴衝突

<dependency> 
    <groupId>thirdparty</groupId> 
    <artifactId>main</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
</dependency> 

反過來這第三方主庫依賴於其他兩個庫,這裏有一個部分依賴於它的POM定義管理:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>thirdparty</groupId> 
      <artifactId>x</artifactId> 
      <version>1.0.0</version> 
     </dependency> 
     <dependency> 
      <groupId>thirdparty</groupId> 
      <artifactId>y</artifactId> 
      <version>1.0.0</version> 
     </dependency> 
     ... 

現在第三方X圖書館在其POM定義Y上的依賴關係是這樣的:

<dependency> 
    <groupId>thirdparty</groupId> 
    <artifactId>y</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
</dependency> 

請注意快照版本!這看起來像是第三方poms的問題,但我無法控制它。

但有趣的是,如果您嘗試使用maven構建主要的第三方項目,它會使用(解決並安裝到本地回購)正確的第三方:y:1.0.0版本的工件。但是,當我構建我的原始項目時,它會嘗試解析第三方的快照版本:y。

我的問題是:

  1. 爲什麼會出現這種情況?我確信maven應該選擇最接近項目根目錄的工件版本,在我的情況下,這將是1.0.0

  2. 有沒有什麼辦法可以解決這個問題,而不需要添加顯式的依賴到第三方:y:1.0.0到我的項目的pom?

+0

您是否嘗試使用'thirdparty:main:1.0.0'而不是'thirdparty:main:1.0.0-SNAPSHOT'? –

+0

Usualy沒有理由使用第三方庫的快照版本。如果你想確保某個版本,你可以在你自己的pom中指定你想要的版本(用你想要的版本自己指定依賴),並且絕對可以肯定的是,將它從依賴它的依賴中排除(shouldn不需要,但是這種方式你首先要清楚是什麼導致了它的存在)。 –

回答

0

首先確保你真的需要快照版本。應該通常是一個發佈版本(沒有-SNAPSHOT)。

,如果你確實需要它,這應該做的伎倆:

<properties> 
    <dependeny.main.version>1.0.0-SNAPSHOT</dependeny.main.version> 
    <dependeny.x.version>1.0.0</dependeny.x.version> 
    <dependeny.y.version>1.0.0</dependeny.y.version> 
<properties> 
<dependencies> 
    ... 
    <dependency> 
     <groupId>thirdparty</groupId> 
     <artifactId>main</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>thirdparty</groupId> 
     <artifactId>x</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>thirdparty</groupId> 
     <artifactId>y</artifactId> 
    </dependency> 
    ... 
</dependencies> 

<dependencyManagement> 
    <dependencies> 
     ... 
     <dependency> 
      <groupId>thirdparty</groupId> 
      <artifactId>main</artifactId> 
      <version>${dependeny.main.version}</version> 
      <exclusions> 
       <exclusion> 
        <groupId>thirdparty</groupId> 
        <artifactId>x</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>thirdparty</groupId> 
        <artifactId>y</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>thirdparty</groupId> 
      <artifactId>x</artifactId> 
      <version>${dependeny.x.version}</version> 
      <exclusions> 
       <exclusion> 
        <groupId>thirdparty</groupId> 
        <artifactId>y</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>thirdparty</groupId> 
      <artifactId>y</artifactId> 
      <version>${dependeny.y.version}</version> 
     </dependency> 
     ... 
    </dependencies> 
</dependencyManagement> 

我希望這可以幫助你。