6

我目前正在優化一個多模塊maven項目的maven版本。該項目由大約90個Maven模塊組成。通常有一些交叉庫構成核心,然後大約有15個「應用程序模塊」組成整個應用程序(然後部署爲WAR)創建多模塊maven獨立構建和發佈各個模塊?

現在一般情況下整個項目都有一個主版本「2.5」,所以當一個新的主版本完成時,所有的「應用模塊」都具有相同的版本「2.5.0」。到現在爲止還挺好。

如果某個模塊存在需要修復或需要改進的缺陷,應該發佈該「應用模塊」的新版本。因此,例如模塊A修復了一個錯誤,那麼A.jar應該在版本「2.5.1」中,其餘的應該仍然是「2.5.0」。

父(2.5.0-SNAPSHOT - 模塊A(2.5.1-SNAPSHOT) - 模塊B(2.5.0-SNAPSHOT) - 模塊C(2.5.2-SNAPSHOT) - 戰爭(2.5。 3-SNAPSHOT)< - 3在最後,因爲C有2個重新發布和一個,並在每個模塊發佈後發佈爲簡單起見

我們決定管理主pom中的神器版本,所以我們不在發佈一個模塊後,不需要更新每個artefact的依賴版本

所以現在每當更新的「應用程序模塊」準備就緒時,我們使用maven釋放插件來執行該模塊的發佈(我們正在發佈一個模塊,而不是整個項目)。假設我們在版本2.5.4中發佈了模塊A,導致A.jar被部署爲版本2.5.4,並通過將模塊代碼更新爲2.5.5-SNAPSHOT來完成。

完成此操作後,我們需要更新主POM中的版本,以便所有模塊繼續引用正確的版本。

感謝主POM的dependencyManagement部分,如果我建了戰爭模塊,它會自動選擇模塊A.

現在到了棘手的部分新版本:只要所有模塊被釋放,應該發佈新版本的Web應用程序。這應該包含所有未更改的模塊以及剛剛發佈的模塊。我目前正在努力如何做到這一點。如果我依賴父poms版本,則發行版將包含SNAPSHOT版本(所有版本增量都過高),而我和發行版插件不允許。

什麼是這種困境的最佳解決方案?

我有一個想法是將依賴管理外包給一個單獨的pom,然後使用「import」作用域將其導入到主poms dependencyManagement中。

這種szenario是一個愚蠢的想法?是否有替代方案來開發和維護這樣的大型多模塊應用程序?由於應用程序很大,客戶端應用程序必須加載更新的模塊版本,因此只需要將所有版本同步並在整個項目中使用發佈插件即可。我們的一些客戶的連接速度非常慢,因此每次推出所有模塊都會讓他們真的很不高興。

幫助非常感謝,

克里斯

回答

1

那麼我想出了一個解決我的問題。它是一個小型的releaste-plugin補丁和一個Jenkins Plugin的組合,用於處理需要的非常強大的命令行配置。釋放過程中

說明: https://dev.c-ware.de/confluence/display/PUBLIC/Releasing+modules+of+a+multi-module+project+with+independent+version+numbers

詹金斯插件的說明: 插件的https://dev.c-ware.de/confluence/display/PUBLIC/Developing+a+Jenkins+Plugin+for+the+Maven+Release+Plugin

代碼: https://github.com/chrisdutz/jenkins-release-plugin

2

首先,我們需要認識到的版本號是很重要的,而對於依賴管理的重要,完全是任意的。至少,版本號的形式是任意的(是的,我知道the syntax for Maven version ranges,我從來沒有聽說過任何人使用)。某些OSS項目完全避開「傳統」版本號,只使用SVN存儲庫版本或日期進行版本控制。

一種選擇是沒有「項目範圍」版本,而是允許每個組件具有不同的版本號。我覺得這是完全可以接受的解決方案。

另一種解決方案是使用快照依賴關係進行發佈。你不是「應該」這樣做,但沒有任何東西阻止你對快照版本進行硬編碼(這是非常冗長和時間戳)。無論如何,除了不可重複的構建幽靈之外,什麼都沒有。

如果您必須讓所有組件具有相同的版本號,我建議將內部版本號合併到您的項目版本的次要組件中。

在此方法中,您可以使用Maven Build Number plugin來區分版本中的增量版本,如本問題所述:Can I set the project version with a buildnumber-maven-plugin?

請注意,您只能在構建服務器(或構建工程師)使用的「最終版本」配置文件中執行此操作。

Version Numbers plugin也是你的朋友在這裏。

最終版本的工作流程將類似於如下:

  1. 開始2.5.5-SNAPSHOT版本。
  2. mvn versions:set -DnewVersion 2.5.5
  3. 提交併標記你的發佈(或創建一個分支 - 無論你的策略在這裏)。
  4. mvn deploy -Prelease它激活您的「發佈配置文件」,將構建號添加到工件finalName
  5. mvn versions:set -DnewVersion 2.5.5-SNAPSHOT
  6. 提交您的「發佈後」版本。

當你有一個真正的「主要」版本時,增加到版本2.5.6,2.6.0等。

祝你好運!

+0

嗨noahz, 感謝您的解釋它幫助。我意識到,如果我的模塊彼此之間不存在依賴關係,這將工作。不幸的是,他們這樣做。我有另一個想法如何解決這個問題,並創建了一個新的答案(可以用這種方式編寫多文本;-)) –

0

昨天晚上我意識到我在我的問題中構建的構建還有另一個主要問題:模塊彼此之間存在差異,這些將不會由release插件處理。這些SNAPSHOT依賴會導致插件失敗(這是很好的)。

所以我剛剛有另一個想法可以解決我的問題: 我會創建兩個maven pom工件「versions-dev」和「versions-rel」,其中包含一個用於定義dev和rel版本的dependencyManagement部分。在我的主POM中,我現在將創建兩個配置文件「開發」(默認爲活動狀態)和「釋放」,必須手動激活。這些配置文件包含一個dependencyManagement部分,每個配置文件使用scope「import」導入相應版本-Pom工件的dependencyManagement。

現在發佈將需要執行以下步驟: - 將versions-rel和versions-dev更新爲新版本。 - 提交 - 標籤 - 運行釋放:執行發佈插件的目標

還有一兩件事,可能導致問題:假設所有模塊已被修改,但只有一個應該被包含在一個新的版本,那麼這種方法也會重新部署所有的模塊,即使是我不想發佈的模塊。這會導致更改後的版本與之前發佈的版本部署在同一版本中。現在我可以通過不發佈主項目來避免這種情況,而只是單個模塊。但是,如果只能部署那些未全部部署的版本,則會使發佈過程變得更容易。

任何建議,異議,事情我forgott?

Chris

+0

「我會創建兩個maven pom構件」versions-dev「和」versions-rel「,其中包含一個定義dev和rel版本的dependencyManagement部分。「 - 爲什麼不在一個'pom.xml'中做這個獨特的配置文件?或者甚至更好,使用在'dev'和'release'配置文件中設置的屬性來定義您的依賴版本? – noahlz

+0

這是我終於想出的解決方案,因爲這樣我就可以將版本定義爲屬性,並在整個項目中使用這些屬性。不幸的是,Maven傢伙告訴我,即使我的構建像魅力一樣工作,我應該退還未解除版本的屬性:-( –