2010-11-10 83 views
21

我有maven多模塊項目。如何使一個模塊依賴於另一個模塊工件?

A: parent. 
    B: child1. 
    C: child2. 

B將打包獲取jar文件,然後c將使用此jar文件編譯代碼。

在B中,如果我運行mvn package,它將創建b.jar(留在B/target/jars而不是B/target-作爲另一個目的)。

在C中,我需要使用b.jar來編譯代碼。

現在,從A,我運行時:mvn package。首先,我成功地爲B創建了b.jar文件。

但是,當它進入C的編譯階段時,它看起來像C在類路徑中不識別b.jar(因爲C的代碼無法導入類來自B的文件)。

我的問題是:我該如何解決這個問題?

---------- Below是POM文件

A: pom.xml 
    <groupId>AAA</groupId> 
    <artifactId>A</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
    <module>C</module> 
    <module>B</module> 
    </modules> 

B: pom.xml 
     <groupId>AAA</groupId> 
<artifactId>B</artifactId> 
<packaging>jar</packaging> 
<version>0.0.1-SNAPSHOT</version> 
<parent> 
    <artifactId>A</artifactId> 
    <groupId>AAA</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

C: pom.xml 
     <parent> 
    <artifactId>A</artifactId> 
    <groupId>AAA</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

<groupId>AAA</groupId> 
<artifactId>C</artifactId> 
<packaging>war</packaging> 
<version>0.0.1-SNAPSHOT</version> 

<dependencies> 

    <dependency> 
    <groupId>AAA</groupId> 
    <artifactId>B</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </dependency> 
.... 
+6

正如最佳實踐(與此問題無關),模塊B和C不應聲明自己的groupId和版本;他們應該從父(模塊A)POM繼承這些。他們仍然需要申報自己的包裝和artifactId。 – 2010-12-08 00:17:42

回答

14

看起來它應該工作給我。但您可以嘗試mvn install而不是mvn package

+0

謝謝。這是一個好主意。但是如果我去安裝,那麼c war文件也將被安裝。那個在我目前的項目中是不被接受的。只有jar文件被允許安裝 – David 2010-11-11 04:46:01

+0

你是對的馬特。我會去安裝。 – David 2010-11-14 22:10:09

3

我有一個解決方案:使用具有範圍的依賴性=系統

用C的pom.xml

  <dependency> 
      <groupId>AAA</groupId> 
      <artifactId>B</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
      <scope>system</scope> 
      <systemPath>${basedir}\..\B\target\jars\b.jar</systemPath> 
     </dependency> 

和在一個pom.xml,把模塊B上這樣

頂端
<modules> 
     <module>B</module>  
     <module>C</module> 
</modules> 
+2

大衛,我不知道你在做什麼以及爲什麼「在你現在的項目中戰爭不被接受」,但不是冒犯,這絕對不是正確的方法。 – 2010-11-12 07:06:33

5

我的問題是我如何解決這個問題?

相關決議通過本地存儲庫這樣做的正規途徑「解決」這個問題是從運行install,這樣模塊將獲得安裝在本地倉庫。

現在,關於這樣的評論

但是,如果我再安裝Ç戰爭文件去也將安裝。那一個不是在我的當前項目」接受。

當然,我不是你的項目,我不知道所有的約束和規則。但是,如果你決定使用Maven,這是一個完全荒謬的政策(認真地說,WTF?)和使用範圍依賴關係當然不是一個好的解決方案(後來保證會有更多的麻煩),如果這個政策是真實的,那麼最好不要在這種情況下使用Maven

+0

哦,你說得對。如果安裝只將工件複製到本地存儲庫,那對我來說沒問題。我雖然安裝將複製工件到遠程存儲庫(我在安裝和部署之間感到困惑)。謝謝。 – David 2010-11-14 22:11:05

1

做mvn安裝只放置如果你創建了A,那麼戰爭就沒有理由放在那裏了。

另一方面,如果您使用的是Maven 2.2.x,請查看maven reactor plugin?這應該有助於瘋狂的不可接受的無法將C.war安裝到當前項目的本地.m2存儲庫策略中。

+0

哦,你說得對。如果安裝只將工件複製到本地存儲庫,那對我來說沒問題。我雖然安裝將複製工件到遠程存儲庫(我在安裝和部署之間感到困惑)。謝謝。 – David 2010-11-14 22:09:06

相關問題