2011-08-26 118 views
18

我們有一個大型的多模塊maven項目。爲了提高開發效率,我們最近開始將快照部署到遠程存儲庫(通過中央構建),並引入了maven配置文件,這意味着用戶只需檢出並構建子模塊子集併爲其餘部分創建快照。我們還將遠程存儲庫的更新策略設置爲「從不」,以確保在我們想要更新本地快照時它是明確的。典型的命令就是這樣; mvn -Pref -U乾淨安裝。允許本地構建的快照覆蓋更近期的遠程快照

現在,在maven反應器中,配置文件中定義的模塊的構建完美地工作,maven使用它們的依賴關係的快照,包括從遠程存儲庫下載任何更新的數據(重要說明;以確保我們有一致的集合的快照,我們的中央部署是來自我們項目的所有模塊快照,即使其中只有幾個已經改變)。

當maven將依賴關係解析回配置文件外存在的模塊中的本地構建模塊時,如果快照自該模塊構建後已遠程部署,則maven將此視爲更新的版本並繼續下載並覆蓋本地構建的快照。這可能會導致其他模塊期望在本地更改的模塊中斷。

基本上我想有一個像選擇「使用本地內置快照」的所有模塊中我的個人資料在任何遠程快照,即使時間戳指示遠程快照是更近一些。

其他人在這種情況下做了什麼?

感謝,

保羅

+0

'這可能會導致其他模塊期望在本地更改的模塊出現中斷。如果您有本地更改的模塊 - 只需編譯它,您將在本地存儲庫中擁有最新的快照,並將用於構建。或者我不明白什麼? –

+2

這的確是我所做的。這個問題似乎出現時,說一個後來的模塊依賴於這個本地構建的模塊。此時Maven會檢查遠程快照是否具有比本地快照更晚的時間戳,如果是,請將該快照下載並安裝到本地存儲庫中,以覆蓋本地構建的模塊。 –

+0

順便說一句,我明白,這個問題的一部分是,我在我的中央構建部署所有快照,即使並非所有這些都改變了..我不知道如何設置一個構建/部署,可以智能部署只改變模塊 –

回答

0

問題是什麼文物也必須進行更新,哪些不能進行更新是一個非常困難的問題不僅是行家,但對於用戶。 Maven不是AI。我認爲你可以在離線模式下構建你的項目,以避免文件下載(但是,當然,你想要更新的文件不會被更新)。

3年前我們試圖通過解決這樣的問題:build(你的中央build)只能包含版本(沒有快照)。在那裏 - 你可以確定,如果你建立的項目 - 它是穩定的相同的代碼。如果你改變了一些製作模塊快照的工件,並且在完成工作時創建版本和更新依賴關係。 但是,它導致另一個問題:如果你沒有大的自動測試系統,你可以花費大量的時間來創建版本(錯誤 - >修復 - >版本 - >錯誤 - >修復 - >版本 - >等)。

今天,我在小團隊工作,如果有人更新了他的一部分,他只是說,大家誰想要更新 - 把它 - 誰不 - 不走。

我沒有這樣的問題一個大師。所以,我很樂意聽到更簡單的方法來避免這個問題。

1

我認爲你將不得不防止不變的快照被部署。部署快照基本上是說:

「這是目前最新和最偉大的快照,選擇我比老(在 時間戳的意義上)快照」

我想你可以做一些jiggery -pokery到你的本地快照,比如將一些腳本鏈接到在遠期設置快照時間戳元數據的install階段(因此Maven總是選擇本地通過遠程快照)。但是這對我來說聽起來並不好!

快照部署可以由源代碼管理提交觸發。你可以這樣做嗎?

7

如果您可以更新到Maven 3,則可以使用--no-snapshot-updates命令行開關(-nsu也可用於保存輸入)。在3.0.4中修復了該選項的錯誤,因此請確保您使用的是最新版本。

您也可以嘗試離線模式,但這會停止所有更新檢查,直到您停止「離線」爲止。首先,進行構建以確保將所有依賴項下載到本地存儲庫。然後,您可以通過將<offline>true</offline>添加到settings.xml中(並在準備好再次開始檢查更新時將其切換爲false),或在構建時使用-o--offline命令行開關,進入脫機模式。這適用於Maven的2或3

0

我知道這是很老,但在同樣的問題就來了,並解決它通過拆分建成兩個步驟:

  1. MVN -U依賴性:樹
  2. mvn測試

第一步快照更新沒有構建任何東西,運行速度非常快。

然後第二步是定期編譯/測試,但沒有更新快照。