

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

# CodeArtifact 与 mvn 一起使用
<a name="maven-mvn"></a>

您可以使用 `mvn` 命令来执行 Maven 构建。本节介绍如何配置`mvn`以使用 CodeArtifact 存储库。

**Topics**
+ [提取依赖项](#fetching-dependencies)
+ [发布构件](#publishing-artifacts)
+ [发布第三方构件](#publishing-third-party-artifacts)
+ [将 Maven 依赖项下载限制到存储库 CodeArtifact](#restrict-maven-downloads)
+ [Apache Maven 项目信息](#apache-maven-project-info)

## 提取依赖项
<a name="fetching-dependencies"></a>

`mvn`要配置为从 CodeArtifact 存储库获取依赖项，必须编辑 Maven 配置文件`settings.xml`，也可以编辑项目的 POM。

1. 如果还没有，请按照中所述在环境变量中创建 CodeArtifact 身份验证令牌并将其存储在环境变量中[使用环境变量传递身份验证令牌](tokens-authentication.md#env-var)，以设置对存储 CodeArtifact 库的身份验证。

1. 在 `settings.xml` 中（该文件通常位于 `~/.m2/settings.xml`），添加一个引用 `CODEARTIFACT_AUTH_TOKEN` 环境变量的 `<servers>` 部分，以便 Maven 可在 HTTP 请求中传递令牌。

   ```
   <settings>
   ...
       <servers>
           <server>
               <id>codeartifact</id>
               <username>aws</username>
               <password>${env.CODEARTIFACT_AUTH_TOKEN}</password>
           </server>
       </servers>
   ...
   </settings>
   ```

1. 在`<repository>`元素中添加 CodeArtifact 仓库的 URL 端点。您可以在 `settings.xml` 或项目的 POM 文件中执行此操作。

   您可以使用`get-repository-endpoint` AWS CLI 命令检索仓库的终端节点。

   例如，在名为的域*my\$1repo*中有一个名为的存储库*my\$1domain*，命令如下所示：

   ```
   aws codeartifact get-repository-endpoint --domain my_domain --repository my_repo --format maven
   ```

   `get-repository-endpoint` 命令会返回存储库端点：

   ```
   url 'https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_repo/'
   ```
**注意**  
要使用双堆栈端点，请使用 `codeartifact.region.on.aws` 端点。

   按如下方式将存储库端点添加到 `settings.xml`。

   ```
   <settings>
   ...
       <profiles>
           <profile>
               <id>default</id>
               <repositories>
                   <repository>
                       <id>codeartifact</id>
                       <url>https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_repo/</url>
                   </repository>
               </repositories>
           </profile>
       </profiles>
       <activeProfiles>
           <activeProfile>default</activeProfile>
       </activeProfiles>
       ...
   </settings>
   ```

   或者，您可以将该`<repositories>`部分添加到项目 POM 文件中，仅 CodeArtifact 用于该项目。

   ```
   <project>
   ...
       <repositories>
           <repository>
               <id>codeartifact</id>
               <name>codeartifact</name>
               <url>https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_repo/</url>
           </repository>
       </repositories>
   ...
   </project>
   ```

**重要**  
可以在 `<id>` 元素中使用任何值，但必须与 `<server>` 和 `<repository>` 元素中的值相同。这样，就可以将指定的凭据包含在对的请求中 CodeArtifact。

更改这些配置后，就可以构建项目了。

```
mvn compile
```

Maven 会记录下载到控制台的所有依赖项的完整 URL。

```
[INFO] ------------------< com.example.example:myapp >-------------------
[INFO] Building myapp 1.0
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from codeartifact: https://<domain>.d.codeartifact.us-west-2.amazonaws.com/maven/myrepo/commons-cli/commons-cli/1.4/commons-cli-1.4.pom
Downloaded from codeartifact: https://<domain>.d.codeartifact.us-west-2.amazonaws.com/maven/myrepo/commons-cli/commons-cli/1.4/commons-cli-1.4.pom (11 kB at 3.9 kB/s)
Downloading from codeartifact: https://<domain>.d.codeartifact.us-west-2.amazonaws.com/maven/myrepo/org/apache/commons/commons-parent/42/commons-parent-42.pom
Downloading from codeartifact: https://<domain>.d.codeartifact.us-west-2.amazonaws.com/maven/myrepo/org/apache/commons/commons-parent/42/commons-parent-42.pom
Downloaded from codeartifact: https://<domain>.d.codeartifact.us-west-2.amazonaws.com/maven/myrepo/org/apache/commons/commons-parent/42/commons-parent-42.pom (68 kB at 123 kB/s)
Downloading from codeartifact: https://<domain>.d.codeartifact.us-west-2.amazonaws.com/maven/myrepo/commons-cli/commons-cli/1.4/commons-cli-1.4.jar
Downloaded from codeartifact: https://<domain>.d.codeartifact.us-west-2.amazonaws.com/maven/myrepo/commons-cli/commons-cli/1.4/commons-cli-1.4.jar (54 kB at 134 kB/s)
```

## 发布构件
<a name="publishing-artifacts"></a>

要将 Maven 工件发布`mvn`到 CodeArtifact 存储库，还必须编辑`~/.m2/settings.xml`和项目 POM。

1. 如果还没有，请按照中所述在环境变量中创建 CodeArtifact 身份验证令牌并将其存储在环境变量中[使用环境变量传递身份验证令牌](tokens-authentication.md#env-var)，以设置对存储 CodeArtifact 库的身份验证。

1. 在 `settings.xml` 中添加一个引用 `CODEARTIFACT_AUTH_TOKEN` 环境变量的 `<servers>` 部分，以便 Maven 可在 HTTP 请求中传递令牌。

   ```
   <settings>
   ...
       <servers>
           <server>
               <id>codeartifact</id>
               <username>aws</username>
               <password>${env.CODEARTIFACT_AUTH_TOKEN}</password>
           </server>
       </servers>
   ...
   </settings>
   ```

1. 将 `<distributionManagement>` 部分添加到项目的 `pom.xml`。

   ```
   <project>
   ...
        <distributionManagement>
            <repository>
                <id>codeartifact</id>
                <name>codeartifact</name>
                <url>https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_repo/</url>
            </repository>
        </distributionManagement>
   ...
   </project>
   ```

更改这些配置后，就可以开始构建项目并将项目发布到指定的存储库。

```
mvn deploy
```

使用 `list-package-versions` 来确认程序包已成功发布。

```
aws codeartifact list-package-versions --domain my_domain --domain-owner 111122223333 --repository my_repo --format maven \
  --namespace com.company.framework --package my-package-name
```

示例输出：

```
{
    "defaultDisplayVersion": null,
    "format": "maven",
    "namespace": "com.company.framework",
    "package": "my-package-name",
    "versions": [
        {
            "version": "1.0", 
            "revision": "REVISION-SAMPLE-1-C7F4S5E9B772FC",
            "status": "Published"
        }
    ]
}
```

## 发布第三方构件
<a name="publishing-third-party-artifacts"></a>

您可以使用将第三方 Maven 工件发布到 CodeArtifact 存储库。`mvn deploy:deploy-file`这对于想要发布构件且只有 JAR 文件且无权访问程序包源代码或 POM 文件的用户很有用。

`mvn deploy:deploy-file` 命令会根据命令行中传递的信息生成 POM 文件。

**发布第三方 Maven 构件**

1. 如果还没有，请按照中所述在环境变量中创建 CodeArtifact 身份验证令牌并将其存储在环境变量中[使用环境变量传递身份验证令牌](tokens-authentication.md#env-var)，以设置对存储 CodeArtifact 库的身份验证。

1. 创建 `~/.m2/settings.xml` 文件并输入以下内容：

   ```
   <settings>
       <servers>
           <server>
               <id>codeartifact</id>
               <username>aws</username>
               <password>${env.CODEARTIFACT_AUTH_TOKEN}</password>
           </server>
       </servers>
   </settings>
   ```

1. 运行 `mvn deploy:deploy-file` 命令：

   ```
   mvn deploy:deploy-file -DgroupId=commons-cli          \
   -DartifactId=commons-cli       \
   -Dversion=1.4                  \
   -Dfile=./commons-cli-1.4.jar   \
   -Dpackaging=jar                \
   -DrepositoryId=codeartifact    \
   -Durl=https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/maven/repo-name/
   ```
**注意**  
上面的示例会发布 `commons-cli 1.4`。修改 groupID、artifactID、version 和 file 参数来发布另一个 JAR。

这些说明基于 *Apache Maven* 文档中关于[ JARs 将第三方部署到远程存储库的指南](https://maven.apache.org/guides/mini/guide-3rd-party-jars-remote.html)中的示例。

## 将 Maven 依赖项下载限制到存储库 CodeArtifact
<a name="restrict-maven-downloads"></a>

 如果无法从已配置的存储库提取程序包，则默认情况下，`mvn` 命令会从 Maven Central 提取程序包。将`mirrors`元素添加到`settings.xml`，以便`mvn`始终使用您的 CodeArtifact 存储库。

```
<settings>
  ...
    <mirrors>
      <mirror>
        <id>central-mirror</id>
        <name>CodeArtifact Maven Central mirror</name>
        <url>https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_repo/</url>
        <mirrorOf>central</mirrorOf>
      </mirror>
    </mirrors>
  ...
</settings>
```

如果添加 `mirrors` 元素，则在 `settings.xml` 或 `pom.xml` 中还必须有一个 `pluginRepository` 元素。以下示例从存储库中获取应用程序依赖关系和 Maven 插件。 CodeArtifact 

```
<settings>
...
  <profiles>
    <profile>
      <pluginRepositories>
        <pluginRepository>
          <id>codeartifact</id>
          <name>CodeArtifact Plugins</name>
          <url>https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_repo/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
...
</settings>
```

以下示例从 CodeArtifact 存储库中获取应用程序依赖关系，并从 Maven Central 获取 Maven 插件。

```
<profiles>
   <profile>
     <id>default</id>
     ...
     <pluginRepositories>
       <pluginRepository>
         <id>central-plugins</id>
         <name>Central Plugins</name>
         <url>https://repo.maven.apache.org/maven2/</url>
         <releases>
             <enabled>true</enabled>
         </releases>
         <snapshots>
             <enabled>true</enabled>
         </snapshots>
       </pluginRepository>
     </pluginRepositories>
   ....
   </profile>
 </profiles>
```

## Apache Maven 项目信息
<a name="apache-maven-project-info"></a>

有关 Maven 的更多信息，请参阅 Apache Maven Project 网站上的以下主题：
+  [设置多个存储库](https://maven.apache.org/guides/mini/guide-multiple-repositories.html) 
+  [设置参考](https://maven.apache.org/settings.html) 
+  [分配管理](https://maven.apache.org/pom.html#Distribution_Management) 
+  [配置文件](https://maven.apache.org/pom.html#Profiles) 