使用 Maven 快照 - CodeArtifact

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Maven 快照

Maven 快照是 Maven 套件的特殊版本,參考最新的生產分支程式碼。這是最終版本之前的開發版本。您可以透過附加到套件版本的字尾來識別 Maven SNAPSHOT 套件的快照版本。例如, 版本的快照1.11.1-SNAPSHOT。如需詳細資訊,請參閱 Apache Maven Project 網站上的什麼版本SNAPSHOT?

AWS CodeArtifact 支援發佈和使用 Maven 快照。使用時間型版本編號的唯一快照是唯一受支援的快照。 CodeArtifact 不支援 Maven 2 用戶端產生的非唯一的快照。您可以將支援的 Maven 快照發佈至任何 CodeArtifact 儲存庫。

在 中發佈快照 CodeArtifact

AWS CodeArtifact 支援用戶端在發佈快照mvn時使用的請求模式,例如 。因此,您可以遵循建置工具或套件管理員的文件,而無需詳細了解 Maven 快照的發佈方式。如果您正在做更複雜的事,本節會詳細說明 CodeArtifact 如何處理快照。

當 Maven 快照發佈至 CodeArtifact 儲存庫時,其先前版本會保留在稱為建置的新版本中。每次發佈 Maven 快照時,都會建立新的建置版本。快照的所有先前版本都會保留在其建置版本中。發佈 Maven 快照時,其套件版本狀態會設為 ,Published而包含先前版本的建置狀態會設為 Unlisted。此行為僅適用於 Maven 套件版本,其中套件版本-SNAPSHOT具有尾碼。

例如,名為 的 maven 套件快照版本com.mycompany.myapp:pkg-1會上傳至名為 的 CodeArtifact 儲存庫my-maven-repo。快照版本為 1.0-SNAPSHOT。目前尚未com.mycompany.myapp:pkg-1發佈 的版本。首先,初始建置的資產會發佈於下列路徑:

PUT maven/my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.jar PUT maven/my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.pom

請注意,時間戳記20210728.194552-1是由發佈快照建置的用戶端產生。

上傳 .pom 和 .jar 檔案後,儲存庫com.mycompany.myapp:pkg-1中唯一的 版本為 1.0-20210728.194552-1。即使上述路徑中指定的版本為 ,也會發生這種情況1.0-SNAPSHOT。目前套件版本狀態為 Unfinished

aws codeartifact list-package-versions --domain my-domain --repository \ my-maven-repo --package pkg-1 --namespace com.mycompany.myapp --format maven { "versions": [ { "version": "1.0-20210728.194552-1", "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=", "status": "Unfinished" } ], "defaultDisplayVersion": null, "format": "maven", "package": "pkg-1", "namespace": "com.mycompany.myapp" }

接下來,用戶端會上傳套件版本maven-metadata.xml的檔案:

PUT my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/maven-metadata.xml

成功上傳 maven-metadata.xml 檔案時, 會 CodeArtifact 建立1.0-SNAPSHOT套件版本並將1.0-20210728.194552-1版本設定為 Unlisted

aws codeartifact list-package-versions --domain my-domain --repository \ my-maven-repo --package pkg-1 --namespace com.mycompany.myapp --format maven { "versions": [ { "version": "1.0-20210728.194552-1", "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=", "status": "Unlisted" }, { "version": "1.0-SNAPSHOT", "revision": "tWu8n3IX5HR82vzVZQAxlwcvvA4U/+S80edWNAkil24=", "status": "Published" } ], "defaultDisplayVersion": "1.0-SNAPSHOT", "format": "maven", "package": "pkg-1", "namespace": "com.mycompany.myapp" }

此時,快照版本1.0-SNAPSHOT可以在 建置中使用。雖然儲存庫 com.mycompany.myapp:pkg-1中有兩個版本的 my-maven-repo,但它們都包含相同的資產。

aws codeartifact list-package-version-assets --domain my-domain --repository \ my-maven-repo --format maven --namespace com.mycompany.myapp \ --package pkg-1 --package-version 1.0-SNAPSHOT--query 'assets[*].name' [ "pkg-1-1.0-20210728.194552-1.jar", "pkg-1-1.0-20210728.194552-1.pom" ]

--package-version參數變更為 的情況下執行先前顯示的相同list-package-version-assets命令1.0-20210728.194552-1,會產生相同的輸出。

當額外的 建置1.0-SNAPSHOT新增至儲存庫時,會為每個新建置建立新的Unlisted套件版本。每次1.0-SNAPSHOT都會更新 版本的資產,讓版本一律參考該版本的最新建置。透過上傳新建置maven-metadata.xml的檔案,即可啟動1.0-SNAPSHOT使用最新資產更新 。

使用快照版本

如果您請求快照,Published則會傳回狀態為 的版本。這始終是 Maven 快照的最新版本。您也可以使用建置版本編號 (例如 1.0-20210728.194552-1) 來請求特定建置快照,而不是URL路徑中的快照版本 (例如 1.0-SNAPSHOT)。若要查看 Maven 快照的建置版本,請使用 CodeArtifact API指南ListPackageVersions API中的 ,並將狀態參數設定為 Unlisted

刪除快照版本

若要刪除 Maven 快照的所有建置版本,請使用 DeletePackageVersions API,指定要刪除的版本。

具有 curl 的快照發佈

如果您現有的快照版本存放在 Amazon Simple Storage Service (Amazon S3) 或其他成品儲存庫產品中,您可能需要將其重新發佈至 AWS CodeArtifact。由於 支援 CodeArtifact Maven 快照 (請參閱 在 中發佈快照 CodeArtifact),因此使用一般HTTP用戶端如 發佈快照比發佈 Maven 版本curl更為複雜,如 所述使用 curl 進行發佈。請注意,如果您使用 mvn或 等 Maven 用戶端建置和部署快照版本,則此區段無關gradle。您需要遵循該用戶端的文件。

發佈快照版本涉及發佈一個或多個快照版本的組建。在 中 CodeArtifact,如果快照版本有 n 個組建,則會有 n + 1 CodeArtifact 個版本:n 個組建版本,所有版本的狀態都是 Unlisted,一個快照版本 (最新發佈的組建),狀態為 Published。快照版本 (即具有包含 “-SNAPSHOT”) 的版本字串的版本包含與最新發佈建置相同的資產集。使用 建立此結構的最簡單方法curl如下:

  1. 使用 發佈所有建置的所有資產curl

  2. 使用 發佈上次建置maven-metadata.xml的檔案 (亦即具有最新日期時間戳記的建置)curl。這將在版本字串中建立具有 “-SNAPSHOT” 的版本,並使用正確的資產集。

  3. 使用 將所有非最新建置版本的狀態UpdatePackageVersionsStatusAPI設定為 Unlisted

使用下列curl命令來發佈1.0-SNAPSHOT套件快照版本的快照資產 (例如 .jar 和 .pom 檔案)com.mycompany.app:pkg-1

curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \ -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.jar \ --data-binary @pkg-1-1.0-20210728.194552-1.jar
curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \ -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.pom \ --data-binary @pkg-1-1.0-20210728.194552-1.pom

使用這些範例時:

  • Replace (取代) my_domain 您的 CodeArtifact 網域名稱。

  • Replace (取代) 111122223333 您 CodeArtifact 網域擁有者的 AWS 帳戶 ID。

  • Replace (取代) us-west-2 AWS 區域 CodeArtifact 網域所在的 。

  • Replace (取代) my_maven_repo 您的 CodeArtifact 儲存庫名稱。

重要

您必須在 --data-binary 參數的值前面加上 @ 字元。將值放入引號時,@必須將 包含在引號內。

您可能有兩個以上的資產要為每個建置上傳。例如,除了主要 和 之外,還可能有 Javadoc JAR和來源JAR檔案pom.xml。不需要發佈套件版本資產的檢查總和檔案,因為 CodeArtifact 會自動為每個上傳的資產產生檢查總和。若要驗證資產是否正確上傳,請使用 list-package-version-assets命令擷取產生的檢查總和,並將其與原始檢查總和進行比較。如需 CodeArtifact 如何處理 Maven 總和檢查碼的詳細資訊,請參閱 使用 Maven aven aven aven aven aven aven aven

使用下列 curl 命令來發佈最新建置版本的 maven-metadata.xml 檔案:

curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \ -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/maven-metadata.xml \ --data-binary @maven-metadata.xml

maven-metadata.xml 檔案必須至少參考 <snapshotVersions> 元素中最新建置版本的其中一個資產。此外,<timestamp>值必須存在,且必須符合資產檔案名稱中的時間戳記。例如,對於先前發佈的20210729.171330-2建置, 的內容maven-metadata.xml為:

<?xml version="1.0" encoding="UTF-8"?> <metadata> <groupId>com.mycompany.app</groupId> <artifactId>pkg-1</artifactId> <version>1.0-SNAPSHOT</version> <versioning> <snapshot> <timestamp>20210729.171330</timestamp> <buildNumber>2</buildNumber> </snapshot> <lastUpdated>20210729171330</lastUpdated> <snapshotVersions> <snapshotVersion> <extension>jar</extension> <value>1.0-20210729.171330-2</value> <updated>20210729171330</updated> </snapshotVersion> <snapshotVersion> <extension>pom</extension> <value>1.0-20210729.171330-2</value> <updated>20210729171330</updated> </snapshotVersion> </snapshotVersions> </versioning> </metadata>

發佈maven-metadata.xml之後,最後一個步驟是將所有其他建置版本 (即除最新建置以外的所有建置版本) 設定為套件版本狀態 Unlisted。例如,如果1.0-SNAPSHOT版本有兩個建置,第一個建置為 20210728.194552-1,則要將該建置設定為 的命令Unlisted為:

aws codeartifact update-package-versions-status --domain my-domain --domain-owner 111122223333 \ --repository my-maven-repo --format maven --namespace com.mycompany.app --package pkg-1 \ --versions 1.0-20210728.194552-1 --target-status Unlisted

快照和外部連線

無法透過外部連線從 Maven 公有儲存庫擷取 Maven 快照。 AWS CodeArtifact 僅支援匯入 Maven 發行版本。

快照和上游儲存庫

一般而言,當 Maven 快照與上游儲存庫搭配使用時,其運作方式與 Maven 發行版本相同,但如果您計劃將相同套件版本的快照發佈至兩個具有上游關係的儲存庫,則會有限制。例如,假設 AWS CodeArtifact 網域中有兩個儲存庫,RU,其中 U是 的上游R。如果您在 中發佈新建置R,當 Maven 用戶端請求該快照版本的最新建置時, 會從 CodeArtifact 傳回最新版本U。這可能是非預期的,因為最新版本現在位於 中R,而不是 U。有兩種方法可以避免這種情況:

  1. 如果 1.0-SNAPSHOT1.0-SNAPSHOT存在快照版本,請勿發佈快照版本的建置R,例如 。 U

  2. 使用 CodeArtifact 套件原始伺服器控制項,在 中停用該套件的上游R。後者可讓您在 中發佈 的1.0-SNAPSHOT建置R,但也R可防止從U尚未保留的套件取得任何其他版本。