Maven 快照存儲庫與發布存儲庫
一、概述
在本教程中,我們將解釋 Maven 快照和發布存儲庫之間的區別。
2. Maven 存儲庫
Maven 存儲庫包含一組預編譯的工件,我們可以在應用程序中將其用作依賴項。對於傳統的 Java 應用程序,這些通常是.jar
文件。
通常,有兩種類型的存儲庫:本地和遠程。
本地存儲庫是 Maven 在它正在構建的計算機上創建的存儲庫。它通常位於$HOME/.m2/repository
目錄下。
當我們構建應用程序時,Maven 將在我們的本地存儲庫中搜索依賴項。如果未找到某個依賴項,Maven 將在遠程存儲庫(在settings.xml
或pom.xml
文件中定義)中搜索它。此外,它會將依賴項複製到我們的本地存儲庫以供將來使用。
遠程存儲庫是包含工件的外部存儲庫。一旦 Maven 從遠程存儲庫下載了一個工件,它會更喜歡在本地存儲庫中查找該工件以限制工件下載。
此外,我們可以根據快照和發布存儲庫之間的工件類型來區分存儲庫。
3. 快照存儲庫
快照存儲庫是用於增量的、未發布的工件版本的存儲庫。
快照版本是尚未發布的版本。一般的想法是在發布版本之前有一個快照版本。它允許我們增量部署相同的臨時版本,而不需要項目升級他們正在使用的工件版本。這些項目可以使用相同的版本來獲取更新的快照版本。
例如,在發布1.0.0
版本之前,我們可以擁有它的快照版本。快照版本在版本之後有一個SNAPSHOT
後綴(例如, 1.0.0-SNAPSHOT
)。
3.1。部署工件
持續開發通常使用快照版本控制。使用快照版本,我們可以部署一個工件,其編號由時間戳和內部版本號組成。
假設我們正在開發一個帶有SNAPSHOT
版本的項目:
<groupId>com.baeldung</groupId>
<artifactId>maven-snapshot-repository</artifactId>
<version>1.0.0-SNAPSHOT</version>
我們將把項目部署到一個自託管的 Nexus 存儲庫。
首先,讓我們定義要在其中部署工件的發布存儲庫信息。我們可以使用分發管理插件:
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus-snapshot</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
此外,我們將使用mvn deploy
命令部署我們的項目。
部署後,實際的工件版本將包含時間戳值而不是SNAPSHOT
值。例如,當我們部署1.0.0-SNAPSHOT
時,實際值將包含當前時間戳和內部版本號(例如1.0.0-20220709.063105-3
)。
時間戳值是在工件部署期間計算的。 Maven 生成校驗和並上傳具有相同時間戳的工件文件。
maven-metadata.xml
文件包含有關快照版本的精確信息及其與最新時間戳值的鏈接:
<metadata modelVersion="1.1.0">
<groupId>com.baeldung</groupId>
<artifactId>maven-snapshot-repository</artifactId>
<version>1.0.0-SNAPSHOT</version>
<versioning>
<snapshot>
<timestamp>20220709.063105</timestamp>
<buildNumber>3</buildNumber>
</snapshot>
<lastUpdated>20220709063105</lastUpdated>
<snapshotVersions>
<snapshotVersion>
<extension>jar</extension>
<value>1.0.0-20220709.063105-3</value>
<updated>20220709063105</updated>
</snapshotVersion>
<snapshotVersion>
<extension>pom</extension>
<value>1.0.0-20220709.063105-3</value>
<updated>20220709063105</updated>
</snapshotVersion>
</snapshotVersions>
</versioning>
</metadata>
元數據文件有助於管理從快照版本到時間戳值的轉換。
每次我們在相同的快照版本下部署項目時,Maven 都會生成包含新時間戳值和新構建號的版本。
3.2.下載工件
在下載快照工件之前,Maven 會下載其關聯maven-metadata.xml
文件。這樣,Maven 可以根據時間戳值和內部版本號檢查是否有更新的版本。
這樣一個神器的檢索仍然可以使用SNAPSHOT
版本。
要從存儲庫下載工件,首先,我們需要定義一個依賴存儲庫:
<repositories>
<repository>
<id>nexus</id>
<name>nexus-snapshot</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
默認情況下不啟用快照版本。我們需要手動啟用它們:
<snapshots>
<enabled>true</enabled>
</snapshots>
通過啟用快照,我們可以定義檢查更新版本的SNAPSHOT
工件的頻率。但是,默認更新策略設置為每天一次。我們可以通過設置不同的更新策略來覆蓋此行為:
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
我們可以在updatePolicy
元素中放置四個不同的值:
-
always
— 每次都檢查更新的版本 -
daily
(默認值)——每天檢查一次更新的版本 -
interval:mm
— 根據以分鐘為單位設置的時間間隔檢查更新的版本 -
never
——從不嘗試獲取更新的版本(與我們在本地已有的版本相比)
此外,我們可以通過在命令中傳遞-U
參數來強制更新所有快照工件,而不是定義updatePolicy
:
mvn install -U
此外,如果依賴項已經下載並且校驗和與我們在本地存儲庫中的校驗和相同,則不會重新下載依賴項。
接下來,我們可以將工件的快照版本添加到我們的項目中:
<dependencies>
<dependency>
<groupId>com.baeldung</groupId>
<artifactId>maven-snapshot-repository</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
在開發階段使用快照版本可以防止擁有多個版本的工件。我們可以使用相同的SNAPSHOT
版本,其構建將包含我們代碼在給定時間的快照。
4.發布存儲庫
發布存儲庫包含工件的最終版本(發布)。簡而言之,發布工件代表不應修改其內容的工件。
默認情況下,為我們的settings.xml
或pom.xml
文件中定義的所有存儲庫啟用發布存儲庫。
4.1。部署工件
現在,讓我們在本地 Nexus 存儲庫中部署項目。假設我們已經完成了開發並準備發布項目:
<groupId>com.baeldung</groupId>
<artifactId>maven-release-repository</artifactId>
<version>1.0.0</version>
讓我們在分發管理器中定義發布存儲庫:
<distributionManagement>
<repository>
<id>nexus</id>
<name>nexus-release</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>nexus-snapshot</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
一旦我們從項目版本中刪除單詞SNAPSHOT
,在部署期間將自動選擇發布存儲庫而不是快照存儲庫。
此外,如果我們想在相同版本下重新部署工件,我們可能會收到錯誤消息:“ Repository does not allow updating assets
”。一旦我們部署了發布的工件版本,我們就無法更改它的內容。因此,要解決這個問題,我們只需要發布下一個版本。
4.2.下載工件
Maven 默認從Maven Central Repository中尋找組件。默認情況下,此存儲庫使用發布版本策略。
發布存儲庫只會解析已發布的工件。換句話說,它應該只包含已發布的工件版本,其內容將來不應更改。
如果我們想下載發布的工件,我們需要定義存儲庫:
<repository>
<id>nexus</id>
<name>nexus-release</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
最後,讓我們簡單地將發布的版本添加到我們的項目中:
<dependencies>
<dependency>
<groupId>com.baeldung</groupId>
<artifactId>maven-release-repository</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
5. 結論
在本教程中,我們了解了 Maven 快照和發布存儲庫之間的區別。總而言之,我們應該為仍在開發中的項目使用快照存儲庫,為已準備好投入生產的項目使用發布存儲庫。與往常一樣,示例的源代碼可在 GitHub 上獲得。