2012-01-29 15 views
1

這是ear項目的簡化示例,父pom彙總了EAR,EJB和jar。Jenkins和maven多模塊項目缺失工件

我有這樣的結構在Maven項目,保存在SVN:

parent/ 
|- pom.xml 
|- modulA/ 
| |- pom.xml 
|- modulB/ 
| |- pom.xml 

modulB有MODULA

的依賴pom.xml中有模塊部分

<modules> 
    <module>modulA</module> 
    <module>modulB</module> 
</modules> 

而且依賴管理部分

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>group</groupId> 
      <artifactId>modulA</artifactId> 
      <version>0.0.2-SNAPSHOT</version> 
     </dependency> 
     <dependency> 
      <groupId>group</groupId> 
      <artifactId>modulB</artifactId> 
      <version>0.0.2-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

子模塊引用父

<parent> 
    <groupId>group</groupId> 
    <artifactId>parent</artifactId> 
    <version>0.0.2-SNAPSHOT</version> 
    <relativePath>..</relativePath> 
</parent> 

在我的電腦當我編譯,第一次使用Maven 2.2.1(窗口)

mvn clean compile 

我沒有任何問題

但是....當詹金斯嘗試編譯首次(Maven的2.2.1完成RedHat)

Missing: 
---------- 
1) modulA:jar:0.0.2-SNAPSHOT 

    Try downloading the file manually from the project website. 

    Then, install it using the command: 
     mvn install:install-file -DgroupId=group -DartifactId=modulA -Dversion=0.0.2- SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file 

    Alternatively, if you host your own repository you can deploy the file there: 
     mvn deploy:deploy-file -DgroupId=group -DartifactId=modulA -Dversion=0.0.2-SNAPSHOT -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id] 

    Path to dependency: 
     1) modulB:ejb:0.0.2-SNAPSHOT 
2) modulA:jar:0.0.2-SNAPSHOT 


    ---------- 
    1 required artifacts are missing. 

爲什麼????????

之後,如果我將項目從我的電腦部署到Artifactory,Jenkins沒有問題,因爲Jenkins從存儲庫下載工件...但Jenkins爲什麼依賴存儲庫中的工件?

:(

由於提前

編輯:

我以爲dependencyManagement節只「定義」的依賴,但是如果一個子模塊不使用的依賴,依賴沒有添加到子模塊 我放棄了依賴管理部分,Jenkins中的問題仍然存在。

它適用於我的PC出問題。

+1

是否有可能爲其中一個模塊獲得有效的POM?如果它在本地工作,那麼在問題出現之前,可能會將工件作爲開發的一部分部署到本地存儲庫,直到您試圖在新機器上構建(例如構建機器),纔會有效地隱藏它, – chrisbunney 2012-01-29 14:17:13

+0

如果你在你的盒子上清理你的本地Maven倉庫,那麼第一次構建會在你的盒子上失敗?我猜是的,如果是這樣的話,那意味着構建中的東西在構建之前引用了modulA-0.0.2-SNAPSHOT.jar。很難說沒有看到更多的父母和模塊poms。 – BenjaminLinus 2012-01-30 06:31:03

回答

0

我希望上面的依賴關係管理部分在父pom中。根據您的要求,modulB具有modulA的依賴性。所以我建議你在moduleB中包含依賴項,而不是將它放在父pom中。我想當它第一次運行時,maven正在尋找這兩個依賴關係,因爲你已經在父pom中提到過了。查看你的項目構建順序。首先構建模塊A然後構建模塊B.在你的情況下,我希望你已經在moduleA的pom文件中包含了所有其他的依賴關係,一旦構建它,它就會將一個jar文件部署到m2庫中。然後moduleB開始構建,因爲你的依賴關係已經存在於m2庫中,所以它不會大喊大叫,並且項目將成功構建。

0

您第一次構建父項目時,Jenkins用戶的maven存儲庫將不會安裝modulA。 clean compile然後在modulA中成功運行,但沒有安裝任何東西。當它以modulB運行時,無法解析對modulA的依賴。

如果您的Jenkins工作的目標是clean install而不是clean compile,那麼modulA的工件將在modulB構建開始之前安裝到Jenkins用戶的存儲庫,並且所有工作都將工作。

大概這個工作在你自己的機器上,因爲你至少運行了mvn install modulA一次,或者因爲你的IDE的類路徑爲你解決了問題。