Skip to main content

使用 Maven 构建和测试 Java

您可以在 GitHub Actions 中创建持续集成 (CI) 工作流程,以使用 Maven 构建和测试 Java 项目。

注: GitHub 托管的运行器目前在 GitHub Enterprise Server 上不受支持。 您可以在 GitHub 公共路线图 上查看有关未来支持计划的更多信息。

简介

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

GitHub 托管的运行器有工具缓存预安装的软件,包括 Java Development Kits (JDKs) 和 Maven。 有关软件以及 JDK 和 Maven 预安装版本的列表,请参阅 GitHub 托管的运行器的规格

基本要求

您应该熟悉 YAML 和 GitHub Actions 的语法。 更多信息请参阅:

建议您对 Java 和 Maven 框架有个基本的了解。 更多信息请参阅 Maven 文档中的 Maven 入门指南

在 GitHub Enterprise Server 上使用自托管的运行器

在包含自托管运行器的 GitHub Enterprise Server 上使用设置操作(例如 actions/setup-LANGUAGE)时,您可能需要在没有连接互联网的运行器上设置工具缓存。 更多信息请参阅“在没有互联网连接的自托管运行器上设置工具缓存”。

Using the Maven starter workflow

GitHub provides a Maven starter workflow that will work for most Maven-based Java projects. For more information, see the Maven starter workflow.

To get started quickly, you can choose the preconfigured Maven starter workflow when you create a new workflow. 更多信息请参阅“GitHub Actions 快速入门”。

您也可以通过在仓库的 .github/workflow 目录中创建新文件来手动添加此工作流程。

YAML
name: Java CI

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'
      - name: Build with Maven
        run: mvn --batch-mode --update-snapshots verify

此工作流程执行以下步骤:

  1. checkout 步骤在运行器上下载仓库的副本。
  2. setup-java 步骤配置 Adoptium 的 Java 11 JDK。
  3. “使用 Maven 构建”步骤以非交互模式运行 Maven package 目标,以确保创建代码版本、测试通行证和软件包。

The default starter workflows are excellent starting points when creating your build and test workflow, and you can customize the starter workflow to suit your project’s needs.

在其他操作系统上运行

The starter workflow configures jobs to run on Linux, using the GitHub-hosted ubuntu-latest runners. 您可以更改 runs-on 键,让您的作业在其他操作系统上运行。 例如,您可以使用 GitHub 托管的 Windows 运行器。

runs-on: windows-latest

或者,您可以在 GitHub 托管的 macOS 运行器上运行。

runs-on: macos-latest

您还可以在 Docker 容器中运行作业,或者提供在自己的基础架构上运行的自托管运行器。 更多信息请参阅“GitHub Actions 的工作流程语法”。

指定 JVM 版本和架构

The starter workflow sets up the PATH to contain OpenJDK 8 for the x64 platform. 如果要使用不同的 Java 版本或面向不同的架构(x64x86),您可以使用 setup-java 操作选择不同的 Java 运行时环境。

例如,要使用 Adoptium 提供的用于 x611 平台的 11 版 JDK,您可以使用 setup-java 操作,将 java-versiondistributionarchitecture 参数配置为 '11''adopt'x64

YAML
steps:
  - uses: actions/checkout@v2
  - name: Set up JDK 11 for x64
    uses: actions/setup-java@v2
    with:
      java-version: '11'
      distribution: 'adopt'
      architecture: x64

更多信息请参阅 setup-java 操作。

构建和测试代码

您可以使用与本地相同的命令来构建和测试代码。

初学者工作流程默认将运行 package 目标。 在默认的 Maven 配置中,此命令将下载依赖项、构建类别、运行测试并将类别打包为可分发格式,如 JAR 文件。

如果使用不同的命令来构建项目,或者想要使用不同的目标,则可以指定这些命令。 例如,您可能想要运行在 pom-ci.xml 文件中配置的 verify 目标。

YAML
steps:
  - uses: actions/checkout@v2
  - uses: actions/setup-java@v2
    with:
      java-version: '11'
      distribution: 'adopt'
  - name: Run the Maven verify phase
    run: mvn --batch-mode --update-snapshots verify

缓存依赖项

使用 GitHub 托管的运行器时,您可以缓存依赖项以加速工作流程运行。 运行成功后,您的本地 Maven 仓库将存储在 GitHub Actions 基础架构中。 在未来的工作流程运行中,缓存将会恢复,因此不需要从远程 Maven 仓库下载依赖项。 您可以简单地使用 setup-java 操作缓存依赖项,也可使用 cache 操作进行自定义和更高级的配置。

YAML
steps:
  - uses: actions/checkout@v2
  - name: Set up JDK 11
    uses: actions/setup-java@v2
    with:
      java-version: '11'
      distribution: 'adopt'
      cache: maven
  - name: Build with Maven
    run: mvn --batch-mode --update-snapshots verify

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

将工作流数据打包为构件

构建成功且测试通过后,您可能想要上传生成的 Java 包作为构件。 这会将构建的包存储为工作流程运行的一部分,并允许您下载它们。 构件可帮助您在拉取请求合并之前在本地环境中测试并调试它们。 更多信息请参阅“使用构件持久化工作流程”。

Maven 通常会在 target 目录中创建 JAR、EAR 或 WAR 等输出文件。 要将这些项目上传为构件,可以将它们复制到包含要上传的构件的新目录中。 例如,您可以创建一个名为 staging 的目录。 然后您可以使用 upload-artifact 操作上传该目录的内容。

YAML
steps:
  - uses: actions/checkout@v2
  - uses: actions/setup-java@v2
    with:
      java-version: '11'
      distribution: 'adopt'
  - run: mvn --batch-mode --update-snapshots verify
  - run: mkdir staging && cp target/*.jar staging
  - uses: actions/upload-artifact@v2
    with:
      name: Package
      path: staging