4

可以說我們有3層工程。數據庫,商業,Web和聚合POM。如何發佈具有項目間依賴關係的Maven多模塊項目?

Project 
|-DB 
| |-pom.xml 
|-Business 
| |-pom.xml 
|-pom.xml 

所有的模塊都換貨被釋放和支鏈在一起,所以聚合POM被配置爲相同的版本分配給所有的子模塊。我們有以下版本:

DB-0.1-SNAPSHOT 
Business-0.1-SNAPSHOT which depends on DB-0.1-SNAPSHOT 
Web-0.1-SNAPSHOT which depends on Business-0.1-SNAPSHOT 

在做release:prepare,更新到0.1所有版本,但準備失敗,因爲存在依賴關係沒有DB-0.1呢。

一種解決方案是爲每個模塊中創建不同的項目,同時使用versions:use-releases插件更新的依賴,以0.1

但由於它需要大量的配置和腳本的,我不喜歡這個主意的一個釋放他們的。所以,我更喜歡使用聚合並通過單一命令釋放所有模塊,但問題是,正如我上面所寫,當發佈插件嘗試構建Business-0.1時,存儲庫中還沒有DB-0.1

有什麼辦法可以管理這些項目間依賴關係嗎?

謝謝。

UPD:

即使安裝目標失敗。

  1. DB構建 - OK(無快照也不發行版本中的任何存儲庫)
  2. 業務 - (!在倉庫未發現DB-0.1-SNAPSHOT但它甚至不應該在那裏還)失敗

我使用maven 3.0.2和發佈插件2.1

+0

您已將Business和DB列爲父POM的模塊,對嗎?你正在運行版本:準備*只*在父POM上,對吧?您所描述的功能通常是即開即用的。 – 2011-03-02 12:46:58

+1

是的,它運行如果業務依賴於已存在於存儲庫中的一些舊版本的數據庫。但是,如果你試圖引用不能在版本庫中的新版本,因爲它甚至還沒有構建,那麼不,它不起作用。 – Dima 2011-03-02 13:02:22

+0

它不需要在回購 - Maven會查找其「反應堆」(即目前正在建設的模塊)首先。 – 2011-03-02 13:31:51

回答

2

項目只應在父(項目)定義的版本只有一次。讓所有其他模塊都有父母關係。這意味着你沒有聚合。您有一個多模塊構建。

Project 
|-pom.xml (version 0.1-SNAPSHOT) 
|-DB 
| |-pom.xml (parent: ..) 
|-Business 
| |-pom.xml (parent:..) 

這將解決你的問題(可能是你可以採取look here as an example)。

+0

每個模塊都有參考到母體 「 父 - 測試 com.lookin2.test 0.0.14-SNAPSHOT 」 我構造的釋放plugni設置與父版本每個模塊。問題在於Business依賴於尚未存儲在數據庫中的數據庫版本。如果我將這個依賴關係設置爲已存儲在存儲庫中的某個舊版本,那麼所有工作都正常。我試圖發佈整個項目的新版本時遇到問題。 – Dima 2011-03-02 13:31:22

+0

您正在使用哪個Maven版本?你可以給pom片段特別是引用數據庫依賴嗎? – khmarbaise 2011-03-02 14:37:21

+2

這個答案沒有解決一個模塊(例如Business)如何依賴另一個模塊(例如DB),並且在發佈過程中自動更新該依賴。 – Caoilte 2011-03-05 15:06:46

0

我能夠在這樣使用Maven 3.3.9成功......但讓我介紹我的情況:

我叫Liferay的,一個Java框架,其中有一個叫做服務Builder工具的工作,像你描述的與精確的結構構建和部署使用Maven服務:

Service Layer 
|-pom.xml (version 1.12.0-SNAPSHOT) 
|-Service Portlet 
| |-pom.xml (version 1.16.0-SNAPSHOT)<--- 
|-Service        | Artifact dependency 
| |-pom.xml (version 1.5.0-SNAPSHOT)----- 

正如你所看到的,門戶應用模塊與服務是一個依賴,這是中包接口的.jar文件中建其他事情的服務工作。

順便說一句,我這樣做是使用不同版本的模塊,我的項目。我發現一篇有趣的文章談論這種做法:Releasing modules of a multi-module project with independent version numbers。你可以閱讀摘要來得出關於版本化模塊是否合適的結論。但從我的角度來看,在閱讀客戶的要求之後,我認爲模塊的版本控制應該是Maven支持的一個功能,而不會太痛苦實施。

運行mvn release:preparemvn:perform裏面的父(服務層)是要走的路。 Maven按照以下順序進行版本構建和部署:1)父類2)服務依賴3)服務portlet。

Maven負責處理訂單,這很不錯...但服務依賴關係是基於portlet源代碼構建的,目標在父項目中運行:mvn liferay:build-service ...因此依賴項受到影響由portlet應用程序的源代碼(聽起來有點瘋狂)。對我而言,這是一個棘手的部分。

那麼我們如何獲得爲服務portlet構建和部署的服務依賴項來使用它?

那麼,解決方案是使用maven-release-plugin中的配置,它允許Maven在任何項目中的release:perform階段運行特定目標。我所做的是在父pom.xml中加入在Maven釋放小插件聲明此配置(服務層):

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-release-plugin</artifactId> 
    <version>2.5.2</version> 
    <configuration> 
    <goals>clean liferay:build-service deploy</goals> 
    </configuration> 
</plugin> 

和Maven是能夠部署的父母和每個與我們的孩子模塊的首選版本號(您將被要求輸入)。

總結的答案和建議:嘗試使用<goals>配置和在父級別運行mvn release:preparemvn release:perform

家長和模塊應按照順序進行部署。

我希望這能激發至少5年後類似情況的人。

0

對於多模塊項目,當它失敗的子快照依賴試試這個 版本:乾淨的版本:準備發佈:執行-DignoreSnapshots =真

希望它能幫助。