

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

# 在 Gradle 中使用 CodeArtifact
<a name="maven-gradle"></a>

按照[使用环境变量传递身份验证令牌](tokens-authentication.md#env-var)中所述，将 CodeArtifact 身份验证令牌存入环境变量后，请按照以下说明使用来自 CodeArtifact 存储库的 Maven 程序包，以及将新程序包发布到 CodeArtifact 存储库。

**Topics**
+ [提取依赖项](#fetching-dependencies)
+ [提取插件](#fetching-plugins)
+ [发布构件](#publishing-artifacts)
+ [在 IntelliJ IDEA 中运行 Gradle 构建](#gradle-intellij)

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

要在 Gradle 构建中提取来自 CodeArtifact 的依赖项，请遵循以下程序。

**在 Gradle 构建中提取来自 CodeArtifact 的依赖项**

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

1. 在项目 `build.gradle` 文件中的 `repositories` 部分添加一个 `maven` 部分。

   ```
   maven {
            url 'https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/maven/my_repo/'
            credentials {
                username "aws"
                password System.env.CODEARTIFACT_AUTH_TOKEN
            }
   }
   ```

   前面示例中的 `url` 是 CodeArtifact 存储库的端点。Gradle 使用端点来连接到您的存储库。在示例中，`my_domain` 是域的名称，`111122223333` 是域所有者的 ID，`my_repo` 是存储库的名称。您可以使用 `get-repository-endpoint` AWS CLI 命令检索存储库的端点。

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

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

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

   ```
   url 'https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/maven/my_repo/'
   ```

   前面示例中的 `credentials` 对象包括您在步骤 1 中创建的 CodeArtifact 身份验证令牌，Gradle 使用该令牌对 CodeArtifact 进行身份验证。
**注意**  
要使用双堆栈端点，请使用 `codeartifact.region.on.aws` 端点。

1. （可选）- 要使用 CodeArtifact 存储库作为项目依赖项的唯一来源，请从 `build.gradle` 的 `repositories` 中移除任何其他部分。如果您有多个存储库，Gradle 会按照列出的顺序在每个存储库中搜索依赖项。

1. 配置存储库后，您可以使用标准 Gradle 语法在 `dependencies` 部分添加项目依赖项。

   ```
   dependencies {
       implementation 'com.google.guava:guava:27.1-jre'
       implementation 'commons-cli:commons-cli:1.4'
       testImplementation 'org.testng:testng:6.14.3'
   }
   ```

## 提取插件
<a name="fetching-plugins"></a>

默认情况下，Gradle 会解析来自公有 [Gradle 插件门户](https://plugins.gradle.org/)的插件。要从 CodeArtifact 存储库提取插件，请按以下步骤操作。

**从 CodeArtifact 存储库提取插件**

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

1. 在 `settings.gradle` 文件中添加一个 `pluginManagement` 块。`pluginManagement` 块必须出现在 `settings.gradle` 中的任何其他语句之前，请参阅以下代码段：

   ```
   pluginManagement {
       repositories {
           maven {
               name 'my_repo'
               url 'https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/maven/my_repo/'
               credentials {
                   username 'aws'
                   password System.env.CODEARTIFACT_AUTH_TOKEN
               }
           }
       }
   }
   ```

这将确保 Gradle 会解析来自指定存储库的插件。存储库必须有一个与 Gradle 插件门户网站（例如 `gradle-plugins-store`）有外部连接的上游存储库，以便构建版本可以使用常用的 Gradle 插件。有关更多信息，请参阅 [Gradle 文档](https://docs.gradle.org/current/userguide/plugins.html#sec:custom_plugin_repositories)。

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

本节介绍如何将使用 Gradle 构建的 Java 库发布到 CodeArtifact 存储库。

首先，将 `maven-publish` 插件添加到项目 `build.gradle` 文件的 `plugins` 部分。

```
plugins {
    id 'java-library'
    id 'maven-publish'
}
```

接下来，在项目 `build.gradle` 文件中添加一个 `publishing` 部分。

```
publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId = 'group-id'
            artifactId = 'artifact-id'
            version = 'version'
            from components.java
        }
    }
    repositories {
        maven {
            url 'https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/maven/my_repo/'
            credentials {
                username "aws"
                password System.env.CODEARTIFACT_AUTH_TOKEN
            }
        }
    }
}
```

`maven-publish` 插件根据 `publishing` 部分中指定的 `groupId`、`artifactId` 和 `version` 生成 POM 文件。

对 `build.gradle` 作出的这些更改完成后，运行以下命令来构建项目并将其上传到存储库。

```
./gradlew publish
```

使用 `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
```

示例输出：

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

有关更多信息，请参阅 Gradle 网站上的以下主题：
+  [构建 Java 库](https://guides.gradle.org/building-java-libraries/) 
+  [将项目作为模块发布](https://docs.gradle.org/current/userguide/publishing_setup.html) 

## 在 IntelliJ IDEA 中运行 Gradle 构建
<a name="gradle-intellij"></a>

您可以在 IntelliJ IDEA 中运行 Gradle 构建，从 CodeArtifact 提取依赖项。要使用 CodeArtifact 进行身份验证，您必须向 Gradle 提供 CodeArtifact 授权令牌。提供身份验证令牌的方法有三种。
+ 方法 1：将身份验证令牌存储在 `gradle.properties` 中。如果您能够覆盖 `gradle.properties` 文件或添加内容，请使用此方法。
+ 方法 2：将身份验证令牌存储在单独的文件中。如果您不想修改 `gradle.properties` 文件，请使用此方法。
+ 方法 3：通过在 `build.gradle` 中以内联脚本形式运行 `aws`，为每次运行生成新的身份验证令牌。如果您希望 Gradle 脚本在每次运行时都提取一个新令牌，请使用此方法。令牌不会存储在文件系统中。

------
#### [ Token stored in gradle.properties ]

**方法 1：将身份验证令牌存储在 `gradle.properties` 中**
**注意**  
该示例显示了位于 `GRADLE_USER_HOME` 中的 `gradle.properties` 文件。

1. 使用以下代码段来更新 `build.gradle` 文件：

   ```
   repositories {
       maven {
                url 'https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/maven/my_repo/'
                credentials {
                    username "aws"
                    password "$codeartifactToken"
                }   
       }   
   }
   ```

1. 要从 CodeArtifact 提取插件，请在 `settings.gradle` 文件中添加一个 `pluginManagement` 块。`pluginManagement` 块必须出现在 `settings.gradle` 中的任何其他语句之前。

   ```
   pluginManagement {
       repositories {
           maven {
               name 'my_repo'
               url 'https://my_domain-111122223333.codeartifact.region.amazonaws.com/maven/my_repo/'
               credentials {
                   username 'aws'
                   password "$codeartifactToken"
               }
           }
       }
   }
   ```

1. 提取 CodeArtifact 身份验证令牌：

   ```
   export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text --profile profile-name`
   ```

1. 将身份验证令牌写入 `gradle.properties` 文件中：

   ```
   echo "codeartifactToken=$CODEARTIFACT_AUTH_TOKEN" > ~/.gradle/gradle.properties
   ```

------
#### [ Token stored in separate file ]

**方法 2：将身份验证令牌存储在单独的文件中**

1. 使用以下代码段来更新 `build.gradle` 文件：

   ```
   def props = new Properties()
   file("file").withInputStream { props.load(it) }
   
   repositories {
   
       maven {
                url 'https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/maven/my_repo/'
                credentials {
                    username "aws"
                    password props.getProperty("codeartifactToken")
                }
       }
   }
   ```

1. 要从 CodeArtifact 提取插件，请在 `settings.gradle` 文件中添加一个 `pluginManagement` 块。`pluginManagement` 块必须出现在 `settings.gradle` 中的任何其他语句之前。

   ```
   pluginManagement {
       def props = new Properties()
       file("file").withInputStream { props.load(it) }
       repositories {
           maven {
               name 'my_repo'
               url 'https://my_domain-111122223333.codeartifact.region.amazonaws.com/maven/my_repo/'
               credentials {
                   username 'aws'
                   password props.getProperty("codeartifactToken")
               }
           }
       }
   }
   ```

1. 提取 CodeArtifact 身份验证令牌：

   ```
   export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text --profile profile-name`
   ```

1. 将身份验证令牌写入在 `build.gradle` 文件中指定的文件：

   ```
   echo "codeartifactToken=$CODEARTIFACT_AUTH_TOKEN" > file
   ```

------
#### [ Token generated for each run in build.gradle ]

**方法 3：通过在 `build.gradle` 中以内联脚本形式运行 `aws`，为每次运行生成新的身份验证令牌**

1. 使用以下代码段来更新 `build.gradle` 文件：

   ```
   def codeartifactToken = "aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text --profile profile-name".execute().text
       repositories {
           maven {
               url 'https://my_domain-111122223333.d.codeartifact.region.amazonaws.com/maven/my_repo/'
               credentials {
                   username "aws"
                   password codeartifactToken
               }
           }
       }
   ```

1. 要从 CodeArtifact 提取插件，请在 `settings.gradle` 文件中添加一个 `pluginManagement` 块。`pluginManagement` 块必须出现在 `settings.gradle` 中的任何其他语句之前。

   ```
   pluginManagement {
       def codeartifactToken = "aws codeartifact get-authorization-token --domain my_domain --domain-owner 111122223333 --query authorizationToken --output text --profile profile-name".execute().text
       repositories {
           maven {
               name 'my_repo'
               url 'https://my_domain-111122223333.codeartifact.region.amazonaws.com/maven/my_repo/'
               credentials {
                   username 'aws'
                   password codeartifactToken
               }
           }
       }
   }
   ```

------