# Maven を使用したJavaのビルドとテスト

Maven を使用してJava プロジェクトをビルドしてテストするために、GitHub Actionsで継続的インテグレーション (CI) ワークフローを作成する方法について説明します。

## はじめに

このガイドでは、Maven ソフトウェア プロジェクト管理ツールを使用して、Java プロジェクトの継続的インテグレーション (CI) を実行するワークフローを作成する方法について説明します。 作成するワークフローによって、プルリクエストに対するコミットがデフォルトブランチに対してビルドあるいはテストの失敗を引き起こしたことを見ることができるようになります。このアプローチは、コードが常に健全であることを保証するための役に立ちます。 CIワークフローをキャッシュ ファイルに拡張して、ワークフローの実行による成果物をアップロードするようにもできます。

GitHubホストランナーには、Java開発キット (JDK) と Maven を含む、プレインストールされたソフトウェアを含むツール キャッシュがあります。 JDK と Maven に関するソフトウェアとプレインストールされたバージョンの一覧については、「[GitHub ホステッド ランナー](/ja/enterprise-cloud@latest/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software)」を参照してください。

## 前提条件

YAMLとGitHub Actionsの構文に馴染んでいる必要があります。 詳細については、以下を参照してください:

* [GitHub Actions　のワークフロー構文](/ja/enterprise-cloud@latest/actions/using-workflows/workflow-syntax-for-github-actions)
* [ワークフローの書き込み](/ja/enterprise-cloud@latest/actions/learn-github-actions)

Javaと Maven フレームワークの基本的な理解をお勧めします。 詳細については、Maven ドキュメントの [Maven 使用開始ガイド](https://maven.apache.org/guides/getting-started/index.html)に関するページを参照してください。

## Maven ワークフロー テンプレートの使用

すぐに開始するには、リポジトリの `.github/workflows` ディレクトリにワークフロー テンプレートを追加します。

GitHub には、Maven プロジェクトを使用するほとんどのJavaで動作する Maven 用のワークフロー テンプレートが用意されています。 このガイドの以降のセクションでは、このワークフロー テンプレートをカスタマイズする方法の例を示します。

1. GitHub で、リポジトリのメイン ページに移動します。1. リポジトリ名の下にある **\[<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-play" aria-label="play" role="img"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg> Actions]** をクリックします。

   !["github/docs" リポジトリのタブのスクリーンショット。 \[アクション\] タブがオレンジ色の枠線で強調表示されています。](/assets/images/help/repository/actions-tab-global-nav-update.png)1. ワークフローが既にリポジトリ内にある場合は、 **\[新しいワークフロー]** をクリックします。

2. \[ワークフローの選択] ページには、推奨されるワークフロー テンプレートの選択が表示されます。 "Maven でJava" を検索します。

3. "Maven を使用したJava" ワークフローで、**Configure** をクリックします。

4. 必要に応じてワークフローを編集します。 たとえば、Javaバージョンを変更します。

5. ```
          **[Commit changes]** をクリックします。
   ```

`maven.yml` ワークフロー ファイルが使用中リポジトリの `.github/workflows` ディレクトリに追加されます。

### Javaのバージョンとアーキテクチャの指定

ワークフロー テンプレートで x64 プラットフォーム用の OpenJDK 8 を含むように `PATH` を設定します。 異なるバージョンの Java を使用する場合、あるいは異なるアーキテクチャ (`x64` または `x86`) をターゲットとする場合、`setup-java` アクションを使って異なる Java ランタイム環境を選択できます。

たとえば、x64 プラットフォームに対して Adoptium によって提供される JDK のバージョン 11 を使用するには、`setup-java` アクションを使用して、`java-version`、`distribution`、`architecture` パラメーターを `'11'`、`'temurin'`、`x64` に設定します。

```yaml copy
steps:
  - uses: actions/checkout@v6
  - name: Set up JDK 11 for x64
    uses: actions/setup-java@v4
    with:
      java-version: '11'
      distribution: 'temurin'
      architecture: x64
```

詳細については、「[`setup-java`](https://github.com/actions/setup-java) アクション」を参照してください。

## コードのビルドとテスト

ローカルで使うのと同じコマンドを、コードのビルドとテストに使えます。

ワークフロー テンプレートでは、既定で `package` ターゲットが実行されます。 デフォルトのMavenの設定では、このコマンドは依存関係をダウンロードし、クラスをビルドし、テストを実行し、たとえばJARファイルのような配布可能なフォーマットにクラスをパッケージします。

プロジェクトのビルドに異なるコマンドを使ったり、異なるターゲットを使いたいのであれば、それらを指定できます。 たとえば、`verify` ファイルで構成されている `pom-ci.xml` ターゲットを実行できます。

```yaml copy
steps:
  - uses: actions/checkout@v6
  - uses: actions/setup-java@v4
    with:
      java-version: '17'
      distribution: 'temurin'
  - name: Run the Maven verify phase
    run: mvn --batch-mode --update-snapshots verify
```

## 依存関係のキャッシング

ワークフローの実行速度を上げるために、依存関係をキャッシュすることもできます。 実行に成功すると、ローカルの Maven リポジトリはキャッシュに格納されます。 その後のワークフローの実行では、キャッシュがリストアされ、依存関係をリモートのMavenリポジトリからダウンロードする必要がなくなります。
[
`setup-java` アクション](https://github.com/marketplace/actions/setup-java-jdk)を使用するだけで依存関係をキャッシュすることも、カスタム構成や高度な構成に対して [`cache` アクション](https://github.com/actions/cache)を使用することもできます。

```yaml copy
steps:
  - uses: actions/checkout@v6
  - name: Set up JDK 17
    uses: actions/setup-java@v4
    with:
      java-version: '17'
      distribution: 'temurin'
      cache: maven
  - name: Build with Maven
    run: mvn --batch-mode --update-snapshots verify
```

このワークフローでは、ランナーのホーム ディレクトリの `.m2` ディレクトリにあるローカル Maven リポジトリの内容が保存されます。 キャッシュ キーは `pom.xml` ハッシュされた内容であるため、`pom.xml` を変更するとキャッシュは無効になります。

## 成果物としてのワークフローのデータのパッケージ化

ビルドが成功し、テストが成功したら、結果のJava パッケージをビルド成果物としてアップロードできます。 そうすれば、ビルドされたパッケージをワークフローの実行の一部として保存することになり、それらをダウンロードできるようになります。 アーティファクトを利用して、Pull Requestをマージする前にローカル環境でテストとデバッグを行うことができます。 詳しくは、「[ワークフロー成果物を使ったデータの格納と共有](/ja/enterprise-cloud@latest/actions/using-workflows/storing-workflow-data-as-artifacts)」をご覧ください。

Maven では、通常、JAR、EAR、WAR のような出力ファイルが `target` ディレクトリに作成されます。 それらを成果物としてアップロードするために、アップロードする成果物を含む新しいディレクトリにそれらをコピーできます。 たとえば、`staging` というディレクトリを作成できます。 その後、`upload-artifact` アクションを使用して、そのディレクトリの内容をアップロードできます。

```yaml copy
steps:
  - uses: actions/checkout@v6
  - uses: actions/setup-java@v4
    with:
      java-version: '17'
      distribution: 'temurin'
  - run: mvn --batch-mode --update-snapshots verify
  - run: mkdir staging && cp target/*.jar staging
  - uses: actions/upload-artifact@v4
    with:
      name: Package
      path: staging
```