本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Maven 校验和
将 Maven 构件发布到 AWS CodeArtifact 存储库时,使用与程序包中每个资产或文件关联的校验和来验证上传。资产的例子包括 jar、pom 和 war 文件。对于每个资产,Maven 构件都包含多个校验和文件,这些文件使用带有附加扩展名(例如 md5
或 sha1
)的资产名称。例如,名为 my-maven-package.jar
的文件的校验和文件可能是 my-maven-package.jar.md5
和 my-maven-package.jar.sha1
。
注意
Maven 使用术语“artifact
”。在本指南中,Maven 程序包与 Maven 构件相同。有关更多信息,请参阅 AWS CodeArtifact 程序包。
校验和存储
CodeArtifact 不会将 Maven 校验和存储为资产。这意味着校验和不会作为单个资产出现在 ListPackageVersionAssets API 的输出中。相反,由 CodeArtifact 计算的校验和适用于采用所有受支持校验和类型的每种资产。例如,对 Maven 程序包版本 commons-lang:commons-lang 2.1
调用 ListPackageVersionAssets 的部分响应如下:
{ "name": "commons-lang-2.1.jar", "size": 207723, "hashes": { "MD5": "51591549f1662a64543f08a1d4a0cf87", "SHA-1": "4763ecc9d78781c915c07eb03e90572c7ff04205", "SHA-256": "2ded7343dc8e57decd5e6302337139be020fdd885a2935925e8d575975e480b9", "SHA-512": "a312a5e33b17835f2e82e74ab52ab81f0dec01a7e72a2ba58bb76b6a197ffcd2bb410e341ef7b3720f3b595ce49fdd9994ea887ba08ff6fe21b2c714f8c405af" } }, { "name": "commons-lang-2.1.pom", "size": 9928, "hashes": { "MD5": "8e41bacdd69de9373c20326d231c8a5d", "SHA-1": "a34d992202615804c534953aba402de55d8ee47c", "SHA-256": "f1a709cd489f23498a0b6b3dfbfc0d21d4f15904791446dec7f8a58a7da5bd6a", "SHA-512": "1631ce8fe4101b6cde857f5b1db9b29b937f98ba445a60e76cc2b8f2a732ff24d19b91821a052c1b56b73325104e9280382b2520edda4e7696698165c7e09161" } }, { "name": "maven-metadata.xml", "size": 121, "hashes": { "MD5": "11bb3d48d984f2f49cea1e150b6fa371", "SHA-1": "7ef872be17357751ce65cb907834b6c5769998db", "SHA-256": "d04d140362ea8989a824a518439246e7194e719557e8d701831b7f5a8228411c", "SHA-512": "001813a0333ce4b2a47cf44900470bc2265ae65123a8c6b5ac5f2859184608596baa4d8ee0696d0a497755dade0f6bf5e54667215a06ceae1effdfb7a8d30f88" } }
尽管校验和未存储为资产,但 Maven 客户端仍然可以在预期的位置发布和下载校验和。例如,如果 commons-lang:commons-lang 2.1
位于名为 maven-repo
的存储库中,则 JAR 文件的 SHA-256 校验和的 URL 路径将为:
/maven/maven-repo/commons-lang/commons-lang/2.1/commons-lang-2.1.jar.sha256
如果您使用通用 HTTP 客户端(例如 curl
)将现有 Maven 程序包(例如,之前存储在 Amazon S3 中的程序包)上传到 CodeArtifact,则无需上传校验和。CodeArtifact 会将自动生成校验和。如果要确认已正确上传资产,可以使用 ListPackageVersionAssets API 操作将响应中的校验和与每项资产的原始校验和值进行比较。
发布期间校验和不匹配
除了资产和校验和,Maven 构件还包含一个 maven-metadata.xml
文件。Maven 程序包的正常发布顺序是先上传所有资产和校验和,然后再上传 maven-metadata.xml
。例如,假设客户端配置为发布 SHA-256 校验和文件,则前面所述的 Maven 程序包版本 commons-lang 2.1
的发布顺序为:
PUT commons-lang-2.1.jar PUT commons-lang-2.1.jar.sha256 PUT commons-lang-2.1.pom PUT commons-lang-2.1.pom.sha256 PUT maven-metadata.xml PUT maven-metadata.xml.sha256
上传资产的校验和文件(例如 JAR 文件)时,如果上传的校验和值与 CodeArtifact 计算的校验和值不匹配,则校验和上传请求会失败,并显示 400(错误请求)响应。如果相应的资产不存在,则请求将失败,并显示 404(未找到)响应。为避免出现此错误,您必须先上传资产,然后再上传校验和。
上传 maven-metadata.xml
后,CodeArtifact 通常会将 Maven 程序包版本的状态从 Unfinished
更改为 Published
。如果检测到任何资产的校验和不匹配,CodeArtifact 会返回一个 400(错误请求)来响应 maven-metadata.xml
发布请求。此错误可能会导致客户端停止上传该程序包版本的文件。如果出现这种情况,并且 maven-metadata.xml
文件未上传,则无法下载已上传的程序包版本的任何资产。这是因为程序包版本的状态未设置为 Published
,而是保持为 Unfinished
。
即使 maven-metadata.xml
已上传且程序包版本状态已设置为 Published
,CodeArtifact 仍允许向 Maven 程序包版本添加更多资产。在此状态下,上传不匹配的校验和文件的请求也会失败,并显示 400(错误请求)响应。但是,由于程序包版本状态已设置为 Published
,因此您可以从程序包中下载任何资产,包括校验和文件上传失败的资产。在为校验和文件上传失败的资产下载校验和时,客户端收到的校验和值将是 CodeArtifact 根据上传的资产数据计算出的校验和值。
CodeArtifact 校验和比较区分大小写,CodeArtifact 计算的校验和采用小写格式。因此,如果上传校验和 909FA780F76DA393E992A3D2D495F468
,则因为 CodeArtifact 不会将其视为等于 909fa780f76da393e992a3d2d495f468
,所以校验和不匹配,上传失败。
在校验和不匹配情况下恢复
如果由于校验和不匹配导致校验和上传失败,请尝试以下方法之一进行恢复:
再次运行发布 Maven 构件的命令。如果因网络问题导致校验和文件损坏,此方法可能会起作用。如果这样可以解决网络问题,则校验和匹配且下载成功。
删除程序包版本,然后重新发布。有关更多信息,请参阅《AWS CodeArtifact API 参考》中的 DeletePackageVersions。