

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Maven 校验和
<a name="maven-checksums"></a>

 将 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软件包](https://docs.aws.amazon.com/codeartifact/latest/ug/welcome.html#welcome-concepts-package)。

## 校验和存储
<a name="maven-checksum-storage"></a>

CodeArtifact 不将 Maven 校验和存储为资产。这意味着校验和不会作为单个资产出现在 [ListPackageVersionAssets API](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListPackageVersionAssets.html) 的输出中。取而代之的是，计算的 CodeArtifact校验和适用于所有支持的校验和类型的每种资产。例如，调用 ListPackageVersionAssets Maven 软件包版本的部分响应`commons-lang:commons-lang 2.1`是：

```
{
    "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
```

如果您要 CodeArtifact 使用通用 HTTP 客户端（例如，将现有 Maven 软件包（例如，之前存储在 Amazon S3 中的包）上传到通用 HTTP 客户端`curl`，则无需上传校验和。 CodeArtifact 将自动生成它们。如果您想验证资产是否已正确上传，可以使用 ListPackageVersionAssets API 操作将响应中的校验和与每项资产的原始校验和值进行比较。

## 发布期间校验和不匹配
<a name="maven-checksum-mismatch"></a>

除了资产和校验和，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 文件）的校验和文件时，如果上传的校验和值与由计算的校验和值**不匹配，则校验和上传请求将失败，并显示 400（错误请求）**响应。 CodeArtifact如果相应的资产不存在，则请求将失败，并显示 **404（未找到）**响应。为避免出现此错误，您必须先上传资产，然后再上传校验和。

上传后`maven-metadata.xml`， CodeArtifact 通常会将 Maven 包版本的状态从更改`Unfinished`为。`Published`如果检测到任何资产的校验和不匹配，则 CodeArtifact 会根据`maven-metadata.xml`发布**请求返回 400（错误请求）**。此错误可能会导致客户端停止上传该程序包版本的文件。如果出现这种情况，并且 `maven-metadata.xml` 文件未上传，则无法下载已上传的程序包版本的任何资产。这是因为程序包版本的状态未设置为 `Published`，而是保持为 `Unfinished`。

CodeArtifact 即使`maven-metadata.xml`已上传且软件包版本状态已设置为，也允许向 Maven 软件包版本添加更多资产。`Published`在此状态下，上传不匹配的校验和文件的请求也会失败，并显示 **400（错误请求）**响应。但是，由于程序包版本状态已设置为 `Published`，因此您可以从程序包中下载任何资产，包括校验和文件上传失败的资产。在为上传校验和文件失败的资产下载校验和时，客户端收到的校验和值将是 CodeArtifact 根据上传的资产数据计算得出的校验和值。

CodeArtifact 校验和比较区分大小写，计算的校验和采用 CodeArtifact 小写格式。因此，如果上传了校验和`909FA780F76DA393E992A3D2D495F468`，它将因校验和不匹配而失败，因为它 CodeArtifact 不将其视为等于。`909fa780f76da393e992a3d2d495f468`

## 在校验和不匹配情况下恢复
<a name="maven-checksum-mismatch-recovery"></a>

如果由于校验和不匹配导致校验和上传失败，请尝试以下方法之一进行恢复：
+ 再次运行发布 Maven 构件的命令。如果因网络问题导致校验和文件损坏，此方法可能会起作用。如果这样可以解决网络问题，则校验和匹配且下载成功。
+ 删除程序包版本，然后重新发布。有关更多信息，请参阅 *AWS CodeArtifact API 参考[DeletePackageVersions](https://docs.aws.amazon.com/dms/latest/APIReference/API_DeletePackageVersions.html)*中的。