Skip to main content

此版本的 GitHub Enterprise Server 已于以下日期停止服务 2024-09-25. 即使针对重大安全问题,也不会发布补丁。 为了获得更好的性能、更高的安全性和新功能,请升级到最新版本的 GitHub Enterprise。 如需升级帮助,请联系 GitHub Enterprise 支持

使用 Maven 构建和测试 Java

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

Note

GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。 可以在 GitHub public roadmap 上查看有关未来支持计划的更多信息。

简介

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

GitHub 托管的运行器具有预安装了软件的工具缓存,包括 Java 开发工具包 (JDK) 和 Maven。 有关 JDK 和 Maven 的软件和预安装版本列表,请参阅“使用 GitHub 托管的运行器”。

先决条件

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

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

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

在包含自承载运行器的 GitHub Enterprise Server 上使用设置操作(例如 actions/setup-LANGUAGE)时,可能需要在无法访问 Internet 的运行器上设置工具缓存。 有关详细信息,请参阅“在未接入互联网的自托管运行器上设置工具缓存”。

使用 Maven 工作流模板

若要快速开始使用,请将工作流模板添加到存储库的 .github/workflows 目录。

GitHub 为 Maven 提供了一个工作流模板,适用于大多数基于 Maven 的 Java 项目。 本指南的后续部分提供了如何自定义此工作流模板的示例。

  1. 在 GitHub 上,导航到存储库的主页面。

  2. 在存储库名称下,单击 “操作”。

    “github/docs”存储库的选项卡的屏幕截图。 “操作”选项卡以橙色边框突出显示。

  3. 如果存储库中已有工作流,请单击“新建工作流”。

  4. “选择工作流”页面显示一系列推荐的工作流模板。 搜索“Java with Maven”。

  5. 在“Java 与 Maven”工作流上,单击“配置”。

    如果未找到“基于 Maven 的 Java”工作流模板,请将以下工作流代码复制到存储库的 .github/workflows 目录中名为 maven.yml 的新文件。

    YAML
    name: Java CI with Maven
    
    on:
      push:
        branches: [ "main" ]
      pull_request:
        branches: [ "main" ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
        - uses: actions/checkout@v4
        - name: Set up JDK 17
          uses: actions/setup-java@v4
          with:
            java-version: '17'
            distribution: 'temurin'
            cache: maven
        - name: Build with Maven
          run: mvn -B package --file pom.xml
    
        # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
        - name: Update dependency graph
          uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6
    
  6. 根据需要编辑工作流。 例如更改 Java 版本。

  7. 单击“提交更改”。

指定 Java 版本和体系结构

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

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

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

有关详细信息,请参阅 setup-java 操作。

构建和测试代码

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

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

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

YAML
steps:
  - uses: actions/checkout@v4
  - 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 操作缓存依赖项,也 可以使用 cache 操作进行自定义和更高级的配置。

YAML
steps:
  - uses: actions/checkout@v4
  - name: Set up JDK 11
    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 包作为构件。 这会将构建的包存储为工作流程运行的一部分,并允许你下载它们。 构件可帮助你在拉取请求合并之前在本地环境中测试并调试它们。 有关详细信息,请参阅“从工作流存储和共享数据”。

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

YAML
steps:
  - uses: actions/checkout@v4
  - 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@v3
    with:
      name: Package
      path: staging