

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Maven スナップショットを使用する
<a name="maven-snapshots"></a>

 Maven *スナップショット* は、最新のプロダクションブランチコードを参照する Maven パッケージの特別なバージョンです。これは最終リリース版に先行する開発版です。Maven パッケージのスナップショットバージョンは、パッケージバージョンに追加されているサフィックス `SNAPSHOT` で識別できます。例えば、バージョン `1.1` のスナップショットは `1.1-SNAPSHOT` です。詳細については、Apache Maven プロジェクトウェブサイト上の [スナップショットバージョンとは何ですか？](https://maven.apache.org/guides/getting-started/index.html#What_is_a_SNAPSHOT_version) を参照してください。

 AWS CodeArtifact は Maven スナップショットの発行と消費をサポートしています。サポートされているスナップショットは、時間ベースのバージョン番号を使用する一意のスナップショットのみです。CodeArtifact は、Maven 2 クライアントによって生成される一意でないスナップショットをサポートしていません。サポートされている Maven スナップショットは、任意の CodeArtifact リポジトリに公開できます。

**Topics**
+ [スナップショットを CodeArtifact で公開する](#maven-snapshot-publishing)
+ [スナップショットバージョンを使用する](#maven-consuming-snapshot-versions)
+ [スナップショットバージョンを削除する](#maven-deleting-snapshot-versions)
+ [curl を使用してスナップショットを公開する](#maven-snapshot-publishing-curl)
+ [スナップショットと外部接続](#maven-snapshot-external-connections)
+ [スナップショットとアップストリームリポジトリ](#maven-snapshot-upstream-repositories)

## スナップショットを CodeArtifact で公開する
<a name="maven-snapshot-publishing"></a>

AWS CodeArtifact は、 などのクライアントがスナップショットを発行するときに`mvn`使用するリクエストパターンをサポートしています。そのため、Maven スナップショットの公開方法を詳しく理解していなくても、ビルドツールやパッケージマネージャーのドキュメントに従って操作することができます。より複雑な操作を実行する場合は、このセクションの CodeArtifact のスナップショットの処理方法を参照してください。

 Maven スナップショットが CodeArtifact に公開されると、その前のバージョンはビルドという新しいバージョンに保存されます。Maven スナップショットが公開されるたびに、新しいビルドバージョンが作成されます。スナップショットの以前のバージョンはすべて、ビルドバージョンで保持されます。Maven スナップショットが公開されると、そのパッケージバージョンのステータスは `Published` に設定され、前のバージョンを含むビルドのステータスは `Unlisted` に設定されます。この動作は、パッケージバージョンに `-SNAPSHOT` サフィックスが付いている Maven パッケージバージョンのみに適用されます。

例えば、`com.mycompany.myapp:pkg-1` という Maven パッケージのスナップショットバージョンは、`my-maven-repo` という CodeArtifact リポジトリにアップロードされます。スナップショットバージョンは `1.0-SNAPSHOT` です。この時点では、`com.mycompany.myapp:pkg-1` のバージョンは公開されていません。まず、初期ビルドのアセットが以下のパスで公開されます。

```
PUT maven/{{my-maven-repo}}/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.jar
PUT maven/{{my-maven-repo}}/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.pom
```

タイムスタンプ `20210728.194552-1` は、スナップショットビルドを公開するクライアントによって生成されることに注意してください。

.pom ファイルと.jar ファイルがアップロードされると、リポジトリに存在する唯一の `com.mycompany.myapp:pkg-1` のバージョンは `1.0-20210728.194552-1` です。これは、前のパスで指定されたバージョンが `1.0-SNAPSHOT` である場合でも同様です。この時点でのパッケージバージョンステータスは `Unfinished` です。

```
aws codeartifact list-package-versions --domain {{my-domain}} --repository \
  {{my-maven-repo}} --package pkg-1 --namespace com.mycompany.myapp --format maven
{
    "versions": [
        {
            "version": "1.0-20210728.194552-1",
            "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=",
            "status": "Unfinished"
        }
    ],
    "defaultDisplayVersion": null,
    "format": "maven",
    "package": "pkg-1",
    "namespace": "com.mycompany.myapp"
}
```

次に、クライアントはパッケージバージョンの `maven-metadata.xml` ファイルをアップロードします。

```
PUT {{my-maven-repo}}/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/maven-metadata.xml
```

maven-metadata.xml ファイルが正常にアップロードされると、CodeArtifact は `1.0-SNAPSHOT` パッケージバージョンを作成し、`1.0-20210728.194552-1` バージョンを `Unlisted` に設定します。

```
aws codeartifact list-package-versions --domain {{my-domain}} --repository \
  {{my-maven-repo}} --package pkg-1 --namespace com.mycompany.myapp --format maven
{
    "versions": [
        {
            "version": "1.0-20210728.194552-1",
            "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=",
            "status": "Unlisted"
        },
        {
            "version": "1.0-SNAPSHOT",
            "revision": "tWu8n3IX5HR82vzVZQAxlwcvvA4U/+S80edWNAkil24=",
            "status": "Published"
        }
    ],
    "defaultDisplayVersion": "1.0-SNAPSHOT",
    "format": "maven",
    "package": "pkg-1",
    "namespace": "com.mycompany.myapp"
}
```

この時点で、スナップショットバージョン `1.0-SNAPSHOT` はビルドで使用できます。リポジトリ `my-maven-repo` には `com.mycompany.myapp:pkg-1` の 2 つのバージョンが存在しますが、どちらも同じアセットを含んでいます。

```
aws codeartifact list-package-version-assets --domain {{my-domain}} --repository \
  {{my-maven-repo}} --format maven --namespace com.mycompany.myapp \
 --package pkg-1 --package-version 1.0-SNAPSHOT--query 'assets[*].name'
[ 
     "pkg-1-1.0-20210728.194552-1.jar",
     "pkg-1-1.0-20210728.194552-1.pom"
]
```

`--package-version` パラメータを `1.0-20210728.194552-1` に変更して上記と同じ `list-package-version-assets` コマンドを実行すると、同じ出力が得られます。

`1.0-SNAPSHOT` のビルドがリポジトリに追加されると、新しいビルドごとに新しい `Unlisted` パッケージバージョンが作成されます。バージョン `1.0-SNAPSHOT` のアセットは毎回更新されるため、バージョンは常にそのバージョンの最新ビルドになります。`1.0-SNAPSHOT` を最新のアセットで更新するには、新しいビルドの `maven-metadata.xml` ファイルをアップロードします。

## スナップショットバージョンを使用する
<a name="maven-consuming-snapshot-versions"></a>

スナップショットをリクエストすると、ステータス `Published` を持つバージョンが返されます。これは常に Maven スナップショットの最新バージョンです。URL パス内のスナップショットバージョン (`1.0-SNAPSHOT` など) の代わりにビルドバージョン番号 (`1.0-20210728.194552-1` など) を使用して、スナップショットの特定のビルドをリクエストすることもできます。Maven スナップショットのビルドバージョンを確認するには、「*CodeArtifact API Guide*」の [ListPackageVersions ](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListPackageVersions.html) API を使用して、ステータスパラメータを `Unlisted` に設定します。

## スナップショットバージョンを削除する
<a name="maven-deleting-snapshot-versions"></a>

Maven スナップショットのすべてのビルドバージョンを削除するには、[DeletePackageVersions](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_DeletePackageVersions.html) API を使用して削除するバージョンを指定します。

## curl を使用してスナップショットを公開する
<a name="maven-snapshot-publishing-curl"></a>

Amazon Simple Storage Service (Amazon S3) または別のアーティファクトリポジトリ製品に保存されている既存のスナップショットバージョンがある場合は、 AWS CodeArtifact に再公開できます。CodeArtifact は Maven スナップショットをサポートしているため (「[スナップショットを CodeArtifact で公開する](#maven-snapshot-publishing)」を参照)、`curl` などの汎用 HTTP クライアントを使用してスナップショットを公開することは、「[curl で公開する](maven-curl.md)」で説明されている Maven リリースバージョンの公開よりも複雑になります。`mvn` や `gradle` などの Maven クライアントでスナップショットバージョンをビルドしてデプロイする場合、このセクションの記載は適用されないことに注意してください。対象のクライアントのドキュメントに従ってください。

スナップショットバージョンを公開するには、スナップショットバージョンの 1 つ以上のビルドを公開する必要があります。CodeArtifact では、スナップショットバージョンのビルドが *n* 件ある場合、*n\+ 1* の CodeArtifact バージョンが存在します。*n* 個のすべてのビルドバージョンのステータスは `Unlisted` で、1 つのスナップショットバージョン（最新の公開ビルド）のステータスは `Published` です。スナップショットバージョン (つまり、「-SNAPSHOT」を含むバージョン文字列を含むバージョン) には、最新の公開ビルドと同じアセットセットが含まれています。`curl` を使用してこの構造を作成する最も簡単な方法は次のとおりです。

1. `curl` を使用して、すべてのビルドのすべてのアセットを公開します。

1. `curl` を使用して、前のビルド (最新の日付/タイムスタンプが付いたビルド) の `maven-metadata.xml` ファイルを公開します。これにより、バージョン文字列に「`-SNAPSHOT`」を含み、正しいアセットセットを含むバージョンが作成されます。

1. [UpdatePackageVersionsStatus](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_UpdatePackageVersionsStatus.html) API を使用して、最新でないすべてのビルドバージョンのステータスを `Unlisted` に設定します。

 以下の `curl` コマンドを使用して、`com.mycompany.app:pkg-1` パッケージのスナップショットバージョン `1.0-SNAPSHOT` 用のスナップショットアセット (.jar ファイルや.pom ファイルなど) を公開します。

```
curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \
     -X PUT https://{{my_domain-111122223333}}.d.codeartifact.{{us-west-2}}.amazonaws.com/maven/{{my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.jar}} \
     --data-binary {{@pkg-1-1.0-20210728.194552-1.jar}}
```

```
curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \
     -X PUT https://{{my_domain-111122223333}}.d.codeartifact.{{us-west-2}}.amazonaws.com/maven/{{my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.pom}} \
     --data-binary {{@pkg-1-1.0-20210728.194552-1.pom}}
```

これらの例を使用する場合:
+ {{my\_domain}} を CodeArtifact ドメイン名に置き換えます。
+ {{111122223333}} を CodeArtifact ドメインの所有者の AWS アカウント ID に置き換えます。
+ {{us-west-2}} を CodeArtifact ドメインがある AWS リージョン に置き換えます。
+ {{my\_maven\_repo}} を CodeArtifact リポジトリ名に置き換えます。

**重要**  
`--data-binary` パラメータの値には `@` 文字をプレフィックスとして付ける必要があります。値を引用符で囲む場合は、`@` を引用符で囲む必要があります。

ビルドごとにアップロードするアセットが 3 つ以上ある場合があります。例えば、メインの JAR と `pom.xml` に加えて Javadoc ファイルとソース JAR ファイルがある場合があります。CodeArtifact はアップロードされたアセットごとにチェックサムを自動的に生成するため、パッケージバージョンアセットのチェックサムファイルを公開する必要はありません。アセットが正しくアップロードされたことを確認するには、`list-package-version-assets` コマンドを使用して生成されたチェックサムを取得し、元のチェックサムと比較します。CodeArtifact での Maven チェックサムの処理方法の詳細については、「[Maven チェックサムの使用](maven-checksums.md)」を参照してください。

次の curl コマンドを使用して、最新のビルドバージョンの `maven-metadata.xml` ファイルを公開します。

```
curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \
     -X PUT https://{{my_domain-111122223333}}.d.codeartifact.{{us-west-2}}.amazonaws.com/maven/{{my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/}}maven-metadata.xml \
     --data-binary @maven-metadata.xml
```

`maven-metadata.xml` ファイルは、`<snapshotVersions>` エレメントの最新ビルドバージョンのアセットを少なくとも 1 つ参照している必要があります。また `<timestamp>` 値があり、アセットファイル名のタイムスタンプと一致している必要があります。例えば、以前に公開された `20210729.171330-2` ビルドの場合、`maven-metadata.xml` の内容は次のようになります。

```
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>com.mycompany.app</groupId>
  <artifactId>pkg-1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20210729.171330</timestamp>
      <buildNumber>2</buildNumber>
    </snapshot>
    <lastUpdated>20210729171330</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <extension>jar</extension>
        <value>1.0-20210729.171330-2</value>
        <updated>20210729171330</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>1.0-20210729.171330-2</value>
        <updated>20210729171330</updated>
      </snapshotVersion>
    </snapshotVersions>
  </versioning>
</metadata>
```

`maven-metadata.xml` を公開した後の最後のステップは、他のすべてのビルドバージョン (最新のビルド以外のすべてのビルドバージョン) のパッケージバージョンステータスを `Unlisted` に設定することです。例えば、`1.0-SNAPSHOT` バージョンに 2 つのビルドがあり、最初のビルドが `20210728.194552-1` の場合、そのビルドを設定するコマンドは `Unlisted` になります。

```
aws codeartifact update-package-versions-status --domain {{my-domain}} --domain-owner 111122223333 \
   --repository {{my-maven-repo}} --format maven --namespace com.mycompany.app --package pkg-1 \
   --versions 1.0-20210728.194552-1 --target-status Unlisted
```

## スナップショットと外部接続
<a name="maven-snapshot-external-connections"></a>

Maven スナップショットは、外部接続を介して Maven パブリックリポジトリから取得することはできません。 AWS CodeArtifact は Maven リリースバージョンのインポートのみをサポートしています。

## スナップショットとアップストリームリポジトリ
<a name="maven-snapshot-upstream-repositories"></a>

一般的に、Maven スナップショットは、アップストリームリポジトリで使用する場合 Maven リリースバージョンと同じように動作します。しかし、アップストリーム関係にある 2 つのリポジトリに対して同じパッケージバージョンのスナップショットを公開する場合は、制限があります。たとえば、 AWS CodeArtifact ドメインに 2 つのリポジトリがあり、 `R` `U`が のアップストリーム`U`である があるとします`R`。`R` で新しいビルドを公開する場合、Maven クライアントがそのスナップショットバージョンの最新のビルドをリクエストすると、CodeArtifact は `U` から最新バージョンを返します。最新バージョンは `U` ではなく `R` にあるため、これは予期されていない可能性があります。この問題を避けるには、以下の 2 つの方法があります。

1. `U` に `1.0-SNAPSHOT` などのスナップショットバージョンのビルドが存在する場合は、`1.0-SNAPSHOT` を `R` に公開しない。

1. CodeArtifact パッケージオリジンコントロールを使用して、`R` で当該パッケージのアップストリームを無効にする。後者の方法では、`1.0-SNAPSHOT` のビルドを `R` 公開できるようになりますが、その一方で、`U` が保持されていない当該パッケージの他のバージョンを `R` から取得することができなくなります。