

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

# 搭配 Gradle 使用 CodeArtifact
<a name="maven-gradle"></a>

在環境變數中擁有 CodeArtifact 驗證權杖後，如[使用環境變數傳遞驗證權杖](tokens-authentication.md#env-var)中所述，請遵循這些指示從 CodeArtifact 儲存庫取用 Maven 套件，並將新套件發佈至該儲存庫。

**Topics**
+ [擷取相依性](#fetching-dependencies)
+ [擷取外掛程式](#fetching-plugins)
+ [發佈成品](#publishing-artifacts)
+ [在 IntelliJ IDEA 中執行 Gradle 建置](#gradle-intellij)

## 擷取相依性
<a name="fetching-dependencies"></a>

若要從 Gradle 組建中的 CodeArtifact 擷取相依性，請使用下列程序。

**在 Gradle 建置中從 CodeArtifact 擷取相依性**

1. 如果您尚未建立 CodeArtifact 驗證權杖，請依照 中的程序，將權杖存放在 環境變數中[使用 環境變數傳遞身分驗證字符](tokens-authentication.md#env-var)。

1. 將`maven`區段新增至專案`build.gradle`檔案中的 `repositories`區段。

   ```
   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 儲存庫做為專案相依性的唯一來源，`repositories`請從 移除 中的任何其他區段`build.gradle`。如果您有多個儲存庫，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. 如果您尚未建立 CodeArtifact 驗證權杖，請依照 中的程序，將權杖存放在 環境變數中[使用 環境變數傳遞身分驗證字符](tokens-authentication.md#env-var)。

1. 將 `pluginManagement`區塊新增至您的 `settings.gradle` 檔案。`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'
}
```

接著，將`publishing`區段新增至專案`build.gradle`檔案。

```
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` 區段中`version`指定的 `groupId`、 `artifactId`和 產生 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：在 中`aws`以內嵌指令碼執行 ，為每次執行產生新的身分驗證權杖`build.gradle`。如果您希望 Gradle 指令碼在每次執行時擷取新的字符，請使用此方法。字符不會存放在檔案系統上。

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

**方法 1：將身分驗證字符存放在 `gradle.properties`**
**注意**  
此範例顯示位於 中的 `gradle.properties` 檔案`GRADLE_USER_HOME`。

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 擷取外掛程式，請將 `pluginManagement`區塊新增至 `settings.gradle` 檔案。`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 擷取外掛程式，請將 `pluginManagement`區塊新增至 `settings.gradle` 檔案。`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：在 中`aws`以內嵌指令碼執行 ，為每次執行產生新的身分驗證權杖 `build.gradle`**

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 擷取外掛程式，請將 `pluginManagement`區塊新增至 `settings.gradle` 檔案。`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
               }
           }
       }
   }
   ```

------