# Maven を使用したJava パッケージの発行

このチュートリアルでは、Maven を使用して、継続的インテグレーション (CI) ワークフローの一部としてJava パッケージをレジストリに発行する方法について説明します。

## はじめに

このガイドは、JavaのパッケージをGitHub PackagesやMaven Central Repositoryに公開するワークフローの作成方法を紹介します。 1つのワークフローで、パッケージを1つのリポジトリあるいは複数のリポジトリに公開できます。

> \[!WARNING] このガイドで使われている例は、レガシ OSSRH サービスを参照しています。 Maven Central リポジトリ ドキュメントの「[Publishing](https://central.sonatype.org/faq/what-is-different-between-central-portal-and-legacy-ossrh/#publishing)」(公開) を参照してください。

## 前提条件

ワークフローファイルと設定オプションに関する基本的な理解をしておくことをおすすめします。 詳しくは、「[ワークフローの書き込み](/ja/enterprise-server@3.22/actions/how-tos/write-workflows)」をご覧ください。

Maven を使用してJava プロジェクトの CI ワークフローを作成する方法の詳細については、「[Maven を使用したJavaのビルドとテスト](/ja/enterprise-server@3.22/actions/tutorials/build-and-test-code/java-with-maven)を参照してください。

また、以下の基本的な理解があれば役立ちます。

* [Apache Mavenレジストリの利用](/ja/enterprise-server@3.22/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry)
* [変数に情報を格納する](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)
* [GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)
* [ワークフローでの認証に GITHUB\_TOKEN を使用する](/ja/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)

## パッケージの設定について

`groupId` ファイル内の `artifactId` および \_\_ フィールドは、パッケージをレジストリにリンクするためにレジストリが使用するパッケージの一意の識別子を作成します。 詳細については、Apache Maven ドキュメントの「[Guide to uploading artifacts to the Central Repository](https://maven.apache.org/repository/guide-central-repository-upload.html)」(セントラル リポジトリに成果物をアップロードするためのガイド) を参照してください。

> \[!WARNING] Apache Maven パッケージは名前付け規則に従う必要があるため、`artifactId` フィールドには小文字、数字、またはハイフンのみを含める必要があります。 詳細については、maven.apache.org ドキュメントの「[Naming convention of Maven coordinates](https://maven.apache.org/guides/mini/guide-naming-conventions.html)」(Maven 座標の名前付け規則) を参照してください。 成果物の名前に大文字を使うと、*422 Unprocessable Entity* という応答が返されます。

*pom.xml* ファイルには、Maven がパッケージをデプロイするディストリビューション管理リポジトリの構成も含まれています。 各リポジトリは、名前とデプロイメントURLを持たなければなりません。 これらのリポジトリの認証は、Maven を実行しているユーザーのホーム ディレクトリにある *.m2/settings.xml* ファイルで構成できます。

この `setup-java` アクションを使用して、デプロイ リポジトリと、そのリポジトリの認証を構成できます。 詳細については、「[`setup-java`](https://github.com/actions/setup-java)」を参照してください。

## Maven Central Repositoryへのパッケージの公開

新しいリリースを作成するたびに、パッケージを公開するワークフローを起動できます。 次の例のワークフローでは、`release` イベントが `created` 型でトリガーされたときに実行されます。 このワークフローは、CIテストをパスすればMaven Central Repositoryにパッケージを公開します。
`release` イベントの詳細については、「[ワークフローをトリガーするイベント](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release)」を参照してください。

このワークフローでは、`setup-java` アクションを使用できます。 このアクションにより、特定のバージョンの JDK が `PATH` にインストールされますが、パッケージを発行するための Maven *settings.xml* も構成されます。 既定では、設定ファイルは GitHub Packages用に構成されますが、Maven Central Repository などの別のパッケージ レジストリにデプロイするように構成できます。
*pom.xml* で既にディストリビューション管理リポジトリが構成されている場合は、`id` アクションの呼び出し時にその `setup-java` を指定できます。

たとえば、OSSRH ホスティング プロジェクトを使用して Maven セントラル リポジトリにデプロイする場合、*pom.xml* は `id` の `ossrh` を持つディストリビューション管理リポジトリを指定できます。

```xml copy
<project ...>
  ...
  <distributionManagement>
    <repository>
      <id>ossrh</id>
      <name>Central Repository OSSRH</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>
```

この構成では、リポジトリ管理 `id` を `setup-java` アクションに指定することで、Maven セントラル リポジトリにパッケージを発行するワークフローを作成できます。 リポジトリの認証のために、ユーザ名とパスワードを含む環境変数を提供する必要もあります。

デプロイのステップでは、リポジトリに認証してもらうユーザ名と、認証のためのパスワードあるいはトークンで設定したシークレットを環境変数に設定する必要があります。 詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。

```yaml copy
name: Publish package to the Maven Central Repository
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up Maven Central Repository
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
          server-id: ossrh
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Publish package
        run: mvn --batch-mode deploy
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
```

このワークフローは以下のステップを実行します。

1. プロジェクトのリポジトリをチェックアウトしてコピーを取得します。
2. Java JDK を設定し、maven *settings.xml* ファイルを構成して、`ossrh` および `MAVEN_USERNAME` 環境変数を使用して、`MAVEN_PASSWORD` リポジトリの認証を追加します。
3. `ossrh` リポジトリに公開するには、`mvn --batch-mode deploy` コマンドを実行します。 `MAVEN_USERNAME` 環境変数には `OSSRH_USERNAME` シークレットの内容が設定され、`MAVEN_PASSWORD` 環境変数には `OSSRH_TOKEN` シークレットの内容が設定されます。

   ワークフローでのシークレットの使用について詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。

## GitHub Packages へのパッケージの発行

新しいリリースを作成するたびに、パッケージを公開するワークフローを起動できます。 次の例のワークフローでは、`release` イベントが `created` 型でトリガーされたときに実行されます。 CI テストに合格した場合、ワークフローはパッケージを GitHub Packages に発行します。
`release` イベントの詳細については、「[ワークフローをトリガーするイベント](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release)」を参照してください。

このワークフローでは、`setup-java` アクションを使用できます。 このアクションにより、特定のバージョンの JDK が`PATH`にインストールされ、パッケージを\_\_ に発行するための Maven GitHub Packages も設定されます。 生成された *settings.xml* では、`id` 環境変数をユーザー名として、`github` 環境変数をパスワードとして使用し、`GITHUB_ACTOR` の `GITHUB_TOKEN` を使用してサーバーの認証を定義します。
`GITHUB_TOKEN` 環境変数には、特別な `GITHUB_TOKEN` シークレットの値が割り当てられます。

ワークフロー内のジョブが開始されるたびに、`GITHUB_TOKEN` シークレットはそのリポジトリのアクセス トークンに設定されます。 ワークフロー ファイルでこのアクセス トークンにアクセス許可を設定して、`contents` アクセス許可に対する読み取りアクセスと、`packages` アクセス許可に対する書き込みアクセスを付与する必要があります。 詳しくは、「[ワークフローでの認証に GITHUB\_TOKEN を使用する](/ja/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)」をご覧ください。

Maven ベースのプロジェクトでは、\_\_ エンドポイントを指す `id` の `github` を GitHub Packages ファイル内にディストリビューションリポジトリとして作成することで、これらの設定を利用できます。

たとえば、組織の名前が "octocat" で、リポジトリの名前が "hello-world"、*pom.xmlのGitHub Packages* 構成は次の例のようになります。

```xml copy
<project ...>
  ...
  <distributionManagement>
    <repository>
      <id>github</id>
      <name>GitHub Packages</name>
      <url>https://maven.pkg.github.com/octocat/hello-world</url>
    </repository>
  </distributionManagement>
</project>
```

この構成では、自動的GitHub Packagessettings.xmlを使用して、パッケージを\_\_ に発行するワークフローを作成できます。

```yaml copy
name: Publish package to GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Publish package
        run: mvn --batch-mode deploy
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

このワークフローは以下のステップを実行します。

1. プロジェクトのリポジトリをチェックアウトしてコピーを取得します。
2. Java JDK を設定し、maven *settings.xml* ファイルを自動的に構成して、`github` Maven リポジトリの認証を追加して、`GITHUB_TOKEN` 環境変数を使用します。
3. `mvn --batch-mode deploy` コマンドを実行して、GitHub Packages に公開します。 `GITHUB_TOKEN` 環境変数には、`GITHUB_TOKEN` シークレットの内容が設定されます。 `permissions` キーには、`GITHUB_TOKEN` に付与されているアクセス権を指定します。

   ワークフローでのシークレットの使用について詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。

## Maven Central リポジトリへのパッケージの発行と GitHub Packages

各レジストリのGitHub Packages アクションを使用して、Maven Central リポジトリと`setup-java`の両方にパッケージを発行できます。

*pom.xml* ファイルに、GitHub リポジトリと Maven Central Repository プロバイダーの両方のディストリビューション管理リポジトリが含まれていることを確認します。 たとえば、OSSRH ホスティング プロジェクトを使用して中央リポジトリにデプロイする場合は、`id`を `ossrh` に設定したディストリビューション管理リポジトリで指定し、GitHub Packagesを `id` に設定したディストリビューション管理リポジトリの`github`を指定できます。

```yaml copy
name: Publish package to the Maven Central Repository and GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - name: Set up Java for publishing to Maven Central Repository
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
          server-id: ossrh
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Publish to the Maven Central Repository
        run: mvn --batch-mode deploy
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
      - name: Set up Java for publishing to GitHub Packages
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Publish to GitHub Packages
        run: mvn --batch-mode deploy
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

このワークフローでは、`setup-java` アクションを 2 回呼び出します。
`setup-java` アクションが実行されるたびに、パッケージを発行するための Maven *settings.xml* ファイルが上書きされます。 リポジトリに対する認証の場合、*settings.xml* ファイルはディストリビューション管理リポジトリ `id` とユーザー名とパスワードを参照します。

このワークフローは以下のステップを実行します。

1. プロジェクトのリポジトリをチェックアウトしてコピーを取得します。
2. 初回の `setup-java` の呼び出しを行います。 これにより、\_\_ リポジトリの Maven `ossrh` ファイルが構成され、次の手順で定義されている環境変数に認証オプションが設定されます。
3. `ossrh` リポジトリに公開するには、`mvn --batch-mode deploy` コマンドを実行します。 `MAVEN_USERNAME` 環境変数には `OSSRH_USERNAME` シークレットの内容が設定され、`MAVEN_PASSWORD` 環境変数には `OSSRH_TOKEN` シークレットの内容が設定されます。
4. 2 回目の `setup-java` の呼び出しを行います。 これにより、\_\_ の Maven GitHub Packages ファイルが自動的に構成されます。
5. `mvn --batch-mode deploy` コマンドを実行して、GitHub Packages に公開します。 `GITHUB_TOKEN` 環境変数には、`GITHUB_TOKEN` シークレットの内容が設定されます。 `permissions` キーには、`GITHUB_TOKEN` に付与されているアクセス権を指定します。

   ワークフローでのシークレットの使用について詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。