Maven的快照版本機制就是為了解決多項目依賴開發存在頻繁更改maven依賴版本的問題。比如模塊B依賴模塊A,只需要將模塊A的版本
設定為0.0.1-SNAPSHOT,然后發布到私服中,在發布的過程中,Maven會自動為構件打上時間戳。比如0.0.1-20191214.221414-13就表示2019年12月14日22點14分14秒的第13次快照。有了該時間戳,Maven就能隨時找到倉庫中該構件0.0.1-SNAP-SHOT版本最新的文件。這時,模塊B配置對於模塊A的0.0.1-SNAPSHOT版本的依賴,當構建模塊B的時候,Maven會自動從倉庫中檢查模塊A的0.0.1-SNAPSHOT的最新構件,當發現有更新時便進行下載。
默認情況下,Maven每天檢查一次更新(由倉庫配置的updatePolicy控制)
,用戶也可以使用命令行-U參數強制讓Maven檢查更新,如
mvn clean install-U。
<snapshots> <enabled>true</enabled> <updatePolicy>daily</updatePolicy> <checksumPolicy>ignore</checksumPolicy> </snapshots> 元素updatePolicy用來配置Maven從遠程倉庫檢查更新的頻率,默認的值是daily,表示Maven每天檢查一次。其他可用的值包括:never——從不檢查更新;always——每次構建都檢查更新;in-terval:X——每隔X分鍾檢查一次更新(X為任意整數)。 元素checksumPolicy用來配置Maven檢查檢驗和文件的策略。當構件被部署到Maven倉庫中時,會同時部署對應的校驗和文件。在下載構件的時候,Maven會驗證校驗和文件,如果校驗和驗證失敗,怎么辦?當checksumPolicy的值為默認的warn時,Maven會在執行構建時輸出警告信息,其他可用的值包括:fail——Maven遇到校驗和錯誤就讓構建失敗;ignore——使Maven完全忽略校驗和錯誤。
基於快照版本機制,模塊A在構建成功之后才能將構件部署至倉庫,而模塊B可以完全不用考慮模塊A的構建,並且模塊B能確保隨時得到模塊A的最新可用的快照構件,而這一切都不需要額外的手工操作。
當項目經過完善的測試后需要發布的時候,就應該將快照版本更改為發布版本。例如,將0.0.1-SNAPSHOT更改為0.0.1,表示該版本已經穩定,且只對應了唯一的構件。相比之下,0.0.1-SNAPSHOT往往對應了大量的帶有不同時間戳的構件,這也決定了其不穩定性。
快照版本只應該在組織內部的項目或模塊間依賴使用,因為這時,組織對於這些快照版本的依賴具有完全的理解及控制權。項目不應該依賴於任何組織外部的快照版本依賴,由於快照版本的不穩定性,這樣的依賴會造成潛在的危險。也就是說,即使項目構建今天是成功的,由於外部的快照版本依賴實際對應的構件隨時可能變化,項目的構建就可能由於這些外部的不受控制的因素而失敗。