

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

# 搭配 mvn 使用 CodeArtifact
<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\$1domain 的網域中，使用名為 my\$1repo* 的儲存庫時，命令如下所示： **

   ```
   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. 使用 `CODEARTIFACT_AUTH_TOKEN`環境變數`settings.xml`的參考將`<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、版本和檔案引數以發佈不同的 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`或 中具有 `pluginRepository`元素`pom.xml`。下列範例會從 CodeArtifact 儲存庫擷取應用程式相依性和 Maven 外掛程式。

```
<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 專案網站上的這些主題：
+  [設定多個儲存庫](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) 