2012-10-30 52 views
1

我有這個Maven的層次結構:使用傳遞依賴和排除使用Maven

sim-java 
    ejb 
    web 
    log4j 
    ... 

EJB,Web和log4j的是SIM卡的Java模塊和每個模塊的參考SIM-java編寫父標籤。

我想創建一個log4j模塊,並將它作爲依賴項包含在sim-java中,這樣log4j將作爲ejb和web模塊中的依賴項存在。

基本上,我的SIM-java的內部的pom.xml包含此:(我有耳的模塊,其中將包括com.sim提供範圍:log4j的在耳文件)

<dependencies> 
    <dependency> 
     <groupId>com.sim</groupId> 
     <artifactId>log4j</artifactId> 
     <version>${log4j.version}</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

。現在

,我對我的log4j模塊內部的pom.xml這是一個:

<dependencies> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.17</version> 
    </dependency> 
</dependencies> 

我有這樣的生成錯誤:

30/10/12 18時56分07秒CET:構建log4j錯誤; org.apache.maven.lifecycle.LifecycleExecutionException:無法執行項目目標log4j:無法解析項目com.sim的依賴關係:log4j:jar:0.0.1-SNAPSHOT:找不到工件com.sim:log4j:jar: 0.0.1-SNAPSHOT

我認爲有,因爲SIM卡的Java使用com.sim.log4j作爲傳遞依賴一些依賴性問題,所以我測試了一下log4j的pom.xml的內部:

<dependencies> 
    <dependency> 
     <groupId>com.sim</groupId> 
     <artifactId>sim-java</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <exclusions> 
      <exclusion> 
       <groupId>com.sim</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.17</version> 
    </dependency> 
</dependencies> 

30/10/12 18:59:22 CET:[WARN] com.sim:log4j:jar:0.0.1-SNAPSHOT的POM缺失,無相關信息 30/10/12 1 8:59:22 CET:缺少工件com.sim:log4j:jar:0.0.1-SNAPSHOT:提供 30/10/12 18:59:22 CET:缺少工件com.sim:log4j:jar:0.0.1 -SNAPSHOT:提供 30/10/12 18點59分22秒CET:缺少僞影com.sim:log4j的:罐:0.0.1-SNAPSHOT:提供

也許包括內部模塊com.sim.log4j( ejb,網頁等)會工作,但我想通過sim-java項目使用傳遞依賴。

如何做到這一點?

奧利維爾

回答

2

你不能在父POM上com.sim:log4j的依賴。這種依賴性將在兒童中繼承,這意味着com.sim:log4j將取決於它自己。

而是創建父POM一個<dependencyManagement/>然後聲明中需要它,這裏是webejb孩子使用com.sim:log4j

父POM:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.sim</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Web和EJB POM:

<dependencies> 
    <dependency> 
     <groupId>com.sim</groupId> 
     <artifactId>log4j</artifactId> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

編輯

你仍然可以有一個傳遞依賴僅具有對依賴來自ejb項目的log4j模塊。然後,Web項目將依賴於ejb項目,並且log4j將是傳遞依賴項。

+0

好吧,我懷疑這種行爲。這意味着我必須在所有模塊中手動包含依賴項? Thx –

+0

我添加了一個編輯部分。我懷疑你的web模塊依賴於ejb模塊。因此,如果ejb模塊對log4j模塊有依賴性,它將成爲Web模塊中的傳遞依賴。 – maba

+0

感謝您的編輯,我現在理解得更好,更好的依賴關係。問候 –