# 使用 Maven 构建和测试 Java

了解如何在 GitHub Actions中创建持续集成 （CI） 工作流，以便使用 Maven 生成和测试Java项目。

## 简介

本指南介绍如何使用 Maven 软件项目管理工具为Java项目创建执行持续集成（CI）的工作流。 您创建的工作流程将允许您查看拉取请求提交何时会在默认分支上导致构建或测试失败； 这个方法可帮助确保您的代码始终是健康的。 可以扩展 CI 工作流以缓存文件并从工作流运行中上传项目。

GitHub 托管运行器具有预安装软件的工具缓存，其中包括 Java 开发工具包（JDKs）和 Maven。 有关 JDK 和 Maven 的软件和预安装版本列表，请参阅“[GitHub 托管的运行程序](/zh/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software)”。

## 先决条件

你应该熟悉 YAML 和 GitHub Actions 的语法。 有关详细信息，请参阅：

* [GitHub Actions 的工作流语法](/zh/actions/using-workflows/workflow-syntax-for-github-actions)
* [撰写工作流程](/zh/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. “选择工作流”页面显示一系列推荐的工作流模板。 搜索“Java with Maven”。

3. 在“使用 Maven 的Java”工作流中，单击**Configure**。

4. 根据需要编辑工作流。 例如，更改Java版本。

5. 单击“提交更改”。

工作流文件 `maven.yml` 将添加到存储库的 `.github/workflows` 目录中。

### 指定 Java 版本和体系结构

工作流模板将 `PATH` 设置为包含 OpenJDK 8，用于 x64 平台。 如果要使用不同的 Java 版本或面向不同的体系结构（`x64` 或 `x86`），可以使用 `setup-java` 操作选择不同的 Java 运行时环境。

例如，要使用由 Adoptium 提供的 11 版本的 JDK，用于 x64 平台，可以使用 `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
```

此工作流程将保存本地 Maven 存储库的内容，该存储库位于运行器主目录的 `.m2` 目录。 缓存密钥将是 `pom.xml` 的哈希内容，因此更改 `pom.xml` 会使缓存失效。

## 将工作流数据打包为构件

生成成功且测试通过后，可能需要将生成的Java包作为生成项目上传。 这会将构建的包存储为工作流程运行的一部分，并允许你下载它们。 构件可帮助你在拉取请求合并之前在本地环境中测试并调试它们。 有关详细信息，请参阅“[使用工作流工件存储和共享数据](/zh/actions/using-workflows/storing-workflow-data-as-artifacts)”。

Maven 通常会在 `target` 目录中创建 JAR、EAR 或 WAR 等输出文件。 要将这些作为构件上传，可以将它们复制到一个包含待上传构件的新目录中。 例如，可创建一个名为 `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
```