将红帽构建的 Quarkus 应用程序编译到原生可执行文件


Red Hat build of Quarkus 3.15

Red Hat Customer Content Services

摘要

本指南介绍了如何将红帽构建的 Quarkus 入门项目编译到原生可执行文件中,以及如何配置和测试原生可执行文件。

向红帽构建的 Quarkus 文档提供反馈

要报告错误或改进文档,请登录您的红帽 JIRA 帐户并提交问题。如果您没有红帽 JIRA 帐户,系统会提示您创建一个帐户。

流程

  1. 单击以下链接 来创建 ticket
  2. Summary 中输入有关此问题的简单描述。
  3. 提供有关 描述 中问题或增强功能的详细描述。包括一个 URL,以在文档中发生问题。
  4. Submit 创建问题并将其路由到适当的文档团队。

作为应用程序开发人员,您可以使用红帽构建的 Quarkus 3.15 来创建在 OpenShift Container Platform 和无服务器环境中运行的 Java 编写的微服务。Quarkus 应用程序可以作为常规 Java 应用程序(在 Java 虚拟机(JVM)的顶部)运行,或者编译成原生可执行文件。编译到原生可执行文件的应用程序具有比其 Java 对应部分小的内存占用速度和更快的启动时间。

本指南介绍了如何将 Quarkus 3.15 Getting Started 项目编译到原生可执行文件中,以及如何配置和测试原生可执行文件。您需要之前在 Getting started with Red Hat build of Quarkus 中创建的应用程序。

使用红帽构建的 Quarkus 构建原生可执行文件包括:

  • 使用容器运行时(如 Podman 或 Docker)通过单个命令构建原生可执行文件
  • 使用生成的原生可执行文件创建自定义容器镜像
  • 使用 OpenShift Container Platform Docker 构建策略创建容器镜像
  • 将 Quarkus 原生应用程序部署到 OpenShift Container Platform
  • 配置原生可执行文件
  • 测试原生可执行文件

先决条件

  • JAVA_HOME 环境变量设置为指定 Java SDK 的位置。

    • 登录到红帽客户门户网站,从 Software Downloads 页面下载红帽构建的 OpenJDK。
  • 兼容开放容器项目(OCI)的容器运行时,如 Podman 或 Docker。
  • 已完成的 Quarkus Getting Started 项目。

1.1. 生成原生可执行文件

原生二进制文件是创建在特定操作系统和 CPU 架构中运行的可执行文件。

以下列表概述了原生可执行文件的一些示例:

  • Linux AMD 64 位的 ELF 二进制文件
  • Windows AMD 64 位的 EXE 二进制文件
  • ARM 64 位的 ELF 二进制文件
注意

红帽构建的 Quarkus 中只支持 Linux x86-64 或 AArch64 位的 ELF 二进制文件。

构建原生可执行文件的一个优点是您的应用程序和依赖项(包括 Java 虚拟机(JVM))被打包到单个文件中。应用程序的原生可执行文件包含以下项目:

  • 编译的应用程序代码
  • 所需的 Java 库
  • 用于改进应用程序启动时间和最小磁盘和内存占用量的虚拟机版本(VM)减少,它也是为应用程序代码及其依赖项量身定制的。

要从 Quarkus 应用程序生成原生可执行文件,您可以选择 in-container 构建或 local-host 构建。下表解释了您可以使用的不同构建选项:

Expand
表 1.1. 构建生成原生可执行文件的选项
构建选项Requires使用结果优点

in-container build - Supported

容器运行时,如 Podman 或 Docker

默认 registry.access.redhat.com/quarkus/mandrel-for-jdk-21-rhel8:23.1 构建器镜像

使用主机的 CPU 构架的 Linux 64 位可执行文件

GraalVM 不需要在本地设置,这使得 CI 管道 可以更有效地运行

local-host build - 仅支持上游

本地安装 GraalVM 或 Mandrel

其本地安装作为 quarkus.native.builder-image 属性的默认安装

具有与执行构建的机器相同的操作系统和 CPU 架构的可执行文件

不允许或不希望使用 Docker 或 Podman 等工具的开发人员。总体而言,它比容器内构建方法要快。

重要
  • 红帽构建的 Quarkus 3.15 仅支持使用基于 Java 21 的 Red Hat build of Quarkus Native Builder image (quarkus/mandrel-for-jdk-21-rhel8) 构建原生 Linux 可执行文件,这是 GraalVM Mandrel 的产品的发布。虽然 Quarkus 社区中提供了其他镜像,但它们在产品中不被支持,因此不要将它们用于您希望红帽支持的生产环境构建。
  • 其源基于 17 (没有 Java 18 - 21 功能)编写的应用程序仍然可使用基于 Java 21 的 Mandrel 23.1 基础镜像编译该应用程序的原生可执行文件。
  • 红帽构建的 Quarkus 不支持使用 Oracle GraalVM 社区版本(CE)、Mandrel 社区版本或任何其他 GraalVM 发行版构建原生可执行文件。如需更多信息,请参阅将 红帽构建的 Quarkus 应用程序编译到原生可执行文件

1.1.1. 使用容器内构建生成原生可执行文件

要创建原生可执行文件并运行原生镜像测试,请使用由红帽构建的 Quarkus 为容器内构建提供 的原生 配置集。

先决条件

  • podman 或 Docker 已安装。
  • 容器有权访问至少 8GB 内存。
  • 可选: 已安装 Quarkus CLI,这是可用于构建原生可执行文件的方法之一。如需更多信息 ,请参阅安装 Quarkus CLI
注意

Quarkus CLI 主要用于开发目的,包括创建、更新和构建 Quarkus 项目等任务。但是,红帽不支持在生产环境中使用 Quarkus CLI。

流程

  1. 打开 Getting Started 项目 pom.xml 文件,并验证项目是否包含 原生 配置集:

    <profiles>
      <profile>
        <id>native</id>
        <activation>
          <property>
            <name>native</name>
          </property>
        </activation>
        <properties>
          <skipITs>false</skipITs>
          <quarkus.package.type>native</quarkus.package.type>
        </properties>
      </profile>
    </profiles>
    Copy to Clipboard Toggle word wrap
  2. 使用以下方法之一构建原生可执行文件:

    • 使用 Maven:

      • 对于 Docker:

        ./mvnw package -Dnative -Dquarkus.native.container-build=true
        Copy to Clipboard Toggle word wrap
      • 对于 Podman:

        ./mvnw package -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
        Copy to Clipboard Toggle word wrap
    • 使用 Quarkus CLI:

      • 对于 Docker:

        quarkus build --native -Dquarkus.native.container-build=true
        Copy to Clipboard Toggle word wrap
      • 对于 Podman:

        quarkus build --native -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
        Copy to Clipboard Toggle word wrap

        步骤结果

        这些命令在目标目录中创建一个 *-runner 二进制文件,在其中应用以下内容:

      • *-runner 文件是 Quarkus 生成的构建原生二进制文件。
      • 目标目录 是构建 Maven 应用程序时 Maven 创建的目录。

        重要

        将 Quarkus 应用程序编译到原生可执行文件,在分析和优化过程中消耗大量内存。您可以通过设置 quarkus.native.native-image-xmx 配置属性来限制原生编译过程中使用的内存量。设置较低的内存限值可能会增加构建时间。

  3. 要运行原生可执行文件,请输入以下命令:

    ./target/*-runner
    Copy to Clipboard Toggle word wrap

1.1.2. 使用本地主机构建生成原生可执行文件

如果您不使用 Docker 或 Podman,请使用 Quarkus local-host build 选项创建并运行原生可执行文件。

使用本地主机构建方法比使用容器快,适用于使用 Linux 操作系统的机器。

重要

红帽构建的 Quarkus 不支持在生产环境中使用以下步骤。只有在 Docker 或 Podman 不可用时,仅当测试或作为备份方法时使用此方法。

先决条件

  • Mandrel 或 GraalVm 的本地安装根据 Quarkus 构建原生可执行文件 指南正确配置。

    • 另外,对于 GraalVM 安装,还必须安装 native-image
  • 可选: 已安装 Quarkus CLI,这是可用于构建原生可执行文件的方法之一。如需更多信息 ,请参阅安装 Quarkus CLI
注意

Quarkus CLI 主要用于开发目的,包括创建、更新和构建 Quarkus 项目等任务。但是,红帽不支持在生产环境中使用 Quarkus CLI。

流程

  1. 对于 GraalVM 或 Mandrel,使用以下方法之一构建原生可执行文件:

    • 使用 Maven:

      ./mvnw package -Dnative
      Copy to Clipboard Toggle word wrap
    • 使用 Quarkus CLI:

      quarkus build --native
      Copy to Clipboard Toggle word wrap

      步骤结果

      这些命令在目标目录中创建一个 *-runner 二进制文件,在其中应用以下内容:

      • *-runner 文件是 Quarkus 生成的构建原生二进制文件。
      • 目标目录 是构建 Maven 应用程序时 Maven 创建的目录。

        注意

        构建原生可执行文件时,会启用 prod 配置集,除非在 quarkus.profile 属性中被修改。

  2. 运行原生可执行文件:

    ./target/*-runner
    Copy to Clipboard Toggle word wrap

其他资源

如需更多信息,请参阅 Quarkus "Building a native executable" 指南中的 Producing a native executable 部分。

1.2. 创建自定义容器镜像

您可以使用以下方法之一从 Quarkus 应用程序创建容器镜像:

  • 手动创建容器
  • 使用 OpenShift Container Platform Docker 构建创建容器
重要

将红帽构建的 Quarkus 应用程序编译到原生可执行文件,会在分析和优化过程中消耗大量内存。您可以通过设置 quarkus.native.native-image-xmx 配置属性来限制原生编译过程中使用的内存量。设置较低的内存限值可能会增加构建时间。

1.2.1. 手动创建容器

您可以使用应用程序为 Linux AMD64 手动创建容器镜像。当您使用 Quarkus Native 容器生成原生镜像时,原生镜像会创建一个以 Linux AMD64 为目标的可执行文件。如果您的主机操作系统与 Linux AMD64 不同,则无法直接运行二进制文件,您需要手动创建容器。

您的 Quarkus Getting Started 项目在 src/main/docker 目录中包含一个 Dockerfile.native,其内容如下:

FROM registry.access.redhat.com/ubi8/ubi-minimal:8.10
WORKDIR /work/
RUN chown 1001 /work \
    && chmod "g+rwX" /work \
    && chown 1001:root /work
COPY --chown=1001:root target/*-runner /work/application

EXPOSE 8080
USER 1001

ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"]
Copy to Clipboard Toggle word wrap
注意

通用基础镜像(UBI)

以下列表显示适合用于 Dockerfile 的镜像:

  • Red Hat Universal Base Image 8 (UBI8)。此基础镜像设计为您的所有容器化应用程序、中间件和实用程序的基础层。

    registry.access.redhat.com/ubi8/ubi:8.10
    Copy to Clipboard Toggle word wrap
  • Red Hat Universal Base Image 8 Minimal (UBI8-minimal)。剥离使用 microdnf 作为软件包管理器的 UBI8 镜像。

    registry.access.redhat.com/ubi8/ubi-minimal:8.10
    Copy to Clipboard Toggle word wrap
  • 所有红帽基础镜像都位于容器镜像目录站点。https://catalog.redhat.com/search?gs&q=UBI&searchType=containers

流程

  1. 使用以下方法之一构建原生 Linux 可执行文件:

    • docker:

      ./mvnw package -Dnative -Dquarkus.native.container-build=true
      Copy to Clipboard Toggle word wrap
    • Podman:

      ./mvnw package -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
      Copy to Clipboard Toggle word wrap
  2. 使用以下方法之一构建容器镜像:

    • docker:

      docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
      Copy to Clipboard Toggle word wrap
    • Podman

      podman build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
      Copy to Clipboard Toggle word wrap
  3. 使用以下方法之一运行容器:

    • docker:

      docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-started .
      Copy to Clipboard Toggle word wrap
    • Podman:

      podman run -i --rm -p 8080:8080 quarkus-quickstart/getting-started .
      Copy to Clipboard Toggle word wrap

1.2.2. 使用 OpenShift Docker 构建创建容器

您可以使用 OpenShift Container Platform Docker 构建策略为 Quarkus 应用程序创建容器镜像。此策略使用集群中的构建配置创建容器镜像。

先决条件

  • 您可以访问 OpenShift Container Platform 集群并安装最新版本的 oc 工具。有关安装 oc 的详情,请参考 CLI 工具指南中的安装 OpenShift CLI
  • OpenShift Container Platform API 端点的 URL。

流程

  1. 登录到 OpenShift CLI:

    oc login -u <username_url>
    Copy to Clipboard Toggle word wrap
  2. 在 OpenShift 中创建一个新项目:

    oc new-project <project_name>
    Copy to Clipboard Toggle word wrap
  3. 根据 src/main/docker/Dockerfile.native 文件创建一个构建配置:

    cat src/main/docker/Dockerfile.native | oc new-build --name <build_name> --strategy=docker --dockerfile -
    Copy to Clipboard Toggle word wrap
  4. 构建项目:

    oc start-build <build_name> --from-dir .
    Copy to Clipboard Toggle word wrap
  5. 将项目部署到 OpenShift Container Platform:

    oc new-app <build_name>
    Copy to Clipboard Toggle word wrap
  6. 公开服务:

    oc expose svc/<build_name>
    Copy to Clipboard Toggle word wrap

1.3. 原生可执行配置属性

配置属性定义如何生成原生可执行文件。您可以使用 application.properties 文件配置 Quarkus 应用程序。

配置属性

下表列出了您可以设置的配置属性来定义如何生成原生可执行文件:

Expand

属性

描述

类型

default

quarkus.native.debug.enabled

在单独的 .debug 文件中启用调试并生成调试符号。与 quarkus.native.container-build 一起使用时,红帽构建的 Quarkus 只支持 Red Hat Enterprise Linux 或其他 Linux 发行版,因为它们包含用于安装从原生镜像分割调试信息的 objcopy 实用程序。

布尔值

false

quarkus.native.resources.excludes

以逗号分隔的 glob 列表,以匹配不应添加到原生镜像的资源路径。

字符串列表

 

quarkus.native.additional-build-args

传递给构建过程的其他参数。

字符串列表

 

quarkus.native.enable-http-url-handler

启用 HTTP URL 处理程序,您可以在其中为 HTTP URL 进行 URL.openConnection ()

布尔值

true

quarkus.native.enable-https-url-handler

启用 HTTPS URL 处理程序,您可以在其中为 HTTPS URL 进行 URL.openConnection ()

布尔值

false

quarkus.native.enable-all-security-services

将所有安全服务添加到原生镜像。

布尔值

false

quarkus.native.add-all-charsets

将所有字符集添加到原生镜像。这会增加镜像大小。

布尔值

false

quarkus.native.graalvm-home

包含 GraalVM 发行版的路径。

string

${GRAALVM_HOME:}

quarkus.native.java-home

包含 JDK 的路径。

file

${java.home}

quarkus.native.native-image-xmx

用于生成原生镜像的最大 Java 堆。

string

 

quarkus.native.debug-build-process

在运行原生镜像构建前,等待调试器附加到构建过程。对于那些熟悉 GraalVM 内部的用户,这是一个高级选项。

布尔值

false

quarkus.native.publish-debug-build-process-port

如果 debug-build-processtrue,使用 docker 构建时发布 debug 端口。

布尔值

true

quarkus.native.cleanup-server

重启原生镜像服务器。

布尔值

false

quarkus.native.enable-isolates

启用隔离以提高内存管理。

布尔值

true

quarkus.native.enable-fallback-images

如果原生镜像失败,则创建基于 JVM 的回退镜像。

布尔值

false

quarkus.native.enable-server

使用原生镜像服务器。这可加快编译速度,但可能会导致因为缓存无效问题而丢失的更改。

布尔值

false

quarkus.native.auto-service-loader-registration

自动注册所有 META-INF/services 条目。

布尔值

false

quarkus.native.dump-proxies

转储所有代理的字节码进行检查。

布尔值

false

quarkus.native.container-build

使用容器运行时的构建。Docker 被默认使用。

布尔值

false

quarkus.native.builder-image

构建镜像的 docker 镜像。

string

registry.access.redhat.com/quarkus/mandrel-for-jdk-21-rhel8:23.1

quarkus.native.container-runtime

用于构建镜像的容器运行时。例如,Docker。

string

 

quarkus.native.container-runtime-options

传递给容器运行时的选项。

字符串列表

 

quarkus.native.enable-vm-inspection

在镜像中启用虚拟机内省。

布尔值

false

quarkus.native.full-stack-traces

在镜像中启用完整堆栈跟踪。

布尔值

true

quarkus.native.enable-reports

生成调用路径以及包含的软件包、类或方法的报告。

布尔值

false

quarkus.native.report-exception-stack-traces

报告具有完整堆栈追踪的例外情况。

布尔值

true

quarkus.native.report-errors-at-runtime

在运行时报告错误。如果您使用不支持的功能,这可能会导致应用程序在运行时失败。

布尔值

false

quarkus.native.resources.includes

以逗号分隔的 glob 列表,以匹配应添加到原生镜像的资源路径。使用斜杠(/)字符作为所有平台上的路径分隔符。通配不能以斜杠开头。例如,如果您的源树中有 src/main/resources/ignored.pngsrc/main/resources/foo/selected.png,则依赖项 JAR 之一包含一个 bar/some.txt 文件,quarkus.native.resources.includes 设置为 foo/,bar/237.txt,文件 src/main/resources/foo/selected.pngbar/some.txt 将包含在原生镜像中。虽然 src/main/resources/ignored. png 不会被包含。如需更多信息,请参阅下表,它列出了支持的 glob 功能。

字符串列表

 

在构建配置中,如果要包含共享项目中通用模式或位置的一组文件或资源,您可以使用 glob 模式。

例如,如果您有一个包含多个配置文件的目录,您可以使用 glob 模式来包含该目录中的所有文件。

例如:

quarkus.native.resources.includes = my/config/files/*
Copy to Clipboard Toggle word wrap

以下示例显示了以逗号分隔的 glob 列表,以匹配要添加到原生镜像的资源路径。这些模式会导致将 classpath 上找到的任何 .png 镜像添加到原生镜像,以及以 .txt 结尾的所有文件,即使嵌套在子目录中:

 quarkus.native.resources.includes = **/*.png,bar/**/*.txt
Copy to Clipboard Toggle word wrap

支持的 glob 功能

下表列出了支持的 glob 功能和描述:

Expand

character

功能描述

*

匹配不包含斜杠(/)的可能字符序列。

**

匹配可能包含斜杠(/)的可能字符序列。

?

匹配一个字符,但不匹配斜杠。

[abc]

匹配括号中指定的字符,但不匹配斜杠。

[a-z]

匹配括号中指定的范围内的一个字符,但不匹配斜杠。

[!abc]

匹配括号中未指定的字符; 不匹配斜杠。

[!a-z]

匹配括号中指定的范围之外的一个字符; 不匹配斜杠。

{one,two,three}

匹配以逗号分开的修改错误令牌;令牌可以包含通配符、嵌套更改和范围。

\

转义字符。escaping 有三个级别: application.properties 解析器、MicroProfile Config list converter 和 Glob 解析器。所有三个级别都使用反斜杠作为转义字符。

将红帽构建的 Quarkus 应用程序编译到原生可执行文件,会在分析和优化过程中消耗大量内存。您可以通过设置 quarkus.native.native-image-xmx 配置属性来限制原生编译过程中使用的内存量。设置较低的内存限值可能会增加构建时间。

流程

  • 使用以下方法之一为 quarkus.native.native-image-xmx 属性设置值,在原生镜像构建过程中限制内存消耗:

    • 使用 application.properties 文件:

      quarkus.native.native-image-xmx=<maximum_memory>
      Copy to Clipboard Toggle word wrap
    • 设置系统属性:

      mvn package -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.native-image-xmx=<maximum_memory>
      Copy to Clipboard Toggle word wrap

      此命令使用 Docker 构建原生可执行文件。要使用 Podman,请添加 the -Dquarkus.native.container-runtime=podman 参数。

注意

例如,要将内存限制设置为 8 GB,请输入 quarkus.native.native-image-xmx=8g。该值必须是 1024 的倍数,且大于 2MB。附加字母 mM 以表示 MB 或 gG 以指示千兆字节。

1.4. 测试原生可执行文件

以原生模式测试应用,以测试原生可执行文件的功能。使用 @QuarkusIntegrationTest 注释来构建原生可执行文件,并针对 HTTP 端点运行测试。

重要

以下示例演示了如何在本地安装 GraalVM 或 Mandrel 测试原生可执行文件。开始前,请考虑以下点:

  • 红帽构建的 Quarkus 不支持这种情况,如 Producing a native executable 中所述。
  • 您在此处测试的原生可执行文件必须与主机的操作系统和架构匹配。因此,如果在 macOS 上的容器中构建原生二进制文件,这个过程将无法正常工作。

流程

  1. 打开 pom.xml 文件,并验证 build 部分是否具有以下元素:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>${surefire-plugin.version}</version>
        <executions>
            <execution>
                <goals>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
                <configuration>
                    <systemPropertyVariables>
                        <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                        <maven.home>${maven.home}</maven.home>
                    </systemPropertyVariables>
                </configuration>
            </execution>
        </executions>
    </plugin>
    Copy to Clipboard Toggle word wrap
    • Maven Failsafe 插件(maven-failsafe-plugin)运行集成测试,并指示生成的原生可执行文件的位置。
  2. 打开 src/test/java/org/acme/GreetingResourceIT.java 文件,并验证它是否包含以下内容:

    package org.acme;
    
    import io.quarkus.test.junit.QuarkusIntegrationTest;
    
    @QuarkusIntegrationTest 
    1
    
    public class GreetingResourceIT extends GreetingResourceTest { 
    2
    
    
        // Execute the same tests but in native mode.
    }
    Copy to Clipboard Toggle word wrap
    1
    使用另一个测试运行程序,从原生文件启动应用,然后再测试。可执行文件通过使用 Maven Failsafe 插件中配置的 native.image.path 系统属性来检索。
    2
    本例扩展了 GreetingResourceTest,但您也可以创建新的测试。
  1. 运行测试:

    ./mvnw verify -Dnative
    Copy to Clipboard Toggle word wrap

    以下示例显示了这个命令的输出:

    ./mvnw verify -Dnative
    ....
    
    GraalVM Native Image: Generating 'getting-started-1.0.0-SNAPSHOT-runner' (executable)...
    ========================================================================================================================
    [1/8] Initializing...                                                                                    (6.6s @ 0.22GB)
     Java version: 21.0.4+7-LTS, vendor version: Mandrel-23.1.4.0-1b1
     Graal compiler: optimization level: 2, target machine: x86-64-v3
     C compiler: gcc (redhat, x86_64, 13.2.1)
     Garbage collector: Serial GC (max heap size: 80% of RAM)
     2 user-specific feature(s)
     - io.quarkus.runner.Feature: Auto-generated class by Red&#160;Hat build of Quarkus from the existing extensions
     - io.quarkus.runtime.graal.DisableLoggingFeature: Disables INFO logging during the analysis phase
    [2/8] Performing analysis...  [******]                                                                  (40.0s @ 2.05GB)
      10,318 (86.40%) of 11,942 types reachable
      15,064 (57.36%) of 26,260 fields reachable
      52,128 (55.75%) of 93,501 methods reachable
       3,298 types,   109 fields, and 2,698 methods registered for reflection
          63 types,    68 fields, and    55 methods registered for JNI access
           4 native libraries: dl, pthread, rt, z
    [3/8] Building universe...                                                                               (5.9s @ 1.31GB)
    [4/8] Parsing methods...      [**]                                                                       (3.7s @ 2.08GB)
    [5/8] Inlining methods...     [***]                                                                      (2.0s @ 1.92GB)
    [6/8] Compiling methods...    [******]                                                                  (34.4s @ 3.25GB)
    [7/8] Layouting methods...    [**]                                                                       (4.1s @ 1.78GB)
    [8/8] Creating image...       [**]                                                                       (4.5s @ 2.31GB)
      20.93MB (48.43%) for code area:    33,233 compilation units
      21.95MB (50.80%) for image heap:  285,664 objects and 8 resources
     337.06kB ( 0.76%) for other data
      43.20MB in total
    
    ....
    
    
    [INFO]
    [INFO] --- maven-failsafe-plugin:3.0.0-M7:integration-test (default) @ getting-started ---
    [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running org.acme.GreetingResourceIT
    __  ____  __  _____   ___  __ ____  ______
     --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
     -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/
    2024-09-27 14:04:52,681 INFO  [io.quarkus] (main) getting-started 1.0.0-SNAPSHOT native (powered by Quarkus 3.15.7.redhat-00001) started in 0.038s. Listening on: http://0.0.0.0:8081
    2024-09-27 14:04:52,682 INFO  [io.quarkus] (main) Profile prod activated.
    2024-09-27 14:04:52,682 INFO  [io.quarkus] (main) Installed features: [cdi, rest, smallrye-context-propagation, vertx]
    [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.696 s - in org.acme.GreetingResourceIT
    [INFO]
    [INFO] Results:
    [INFO]
    [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
    [INFO]
    [INFO]
    [INFO] --- maven-failsafe-plugin:3.0.0-M7:verify (default) @ getting-started ---
    Copy to Clipboard Toggle word wrap
    注意

    在自动失败原生测试前,quarkus 会等待 60 秒以便原生镜像启动。您可以通过配置 quarkus.test.wait-time 系统属性来更改此持续时间。

    您可以使用以下命令来扩展等待时间,其中 < duration> 是等待时间(以秒为单位):

    ./mvnw verify -Dnative -Dquarkus.test.wait-time=<duration>
    Copy to Clipboard Toggle word wrap
    注意
    • 默认情况下,原生测试使用 prod 配置文件运行,除非在 quarkus.test.native-image-profile 属性中进行了修改。

1.4.1. 作为原生可执行文件运行时排除测试

当您针对原生可执行文件运行测试时,您只能运行 black-box 测试,例如,与应用的 HTTP 端点交互。

注意

黑色框 指的是产品或程序的隐藏内部工作,比如在黑色测试中。

由于测试不原生运行,因此您无法像在 Java 虚拟机(JVM)上运行测试时所执行的应用程序代码链接。因此,在原生测试中,您无法注入 Bean。

您可以在 JVM 和原生执行间共享测试类,并使用 @DisabledOnIntegrationTest 注释来仅在 JVM 上运行测试,从而排除某些测试。

1.4.2. 测试现有的原生可执行文件

通过使用 Failsafe Maven 插件,您可以针对现有的可执行构建进行测试。您可以在构建后在二进制阶段运行多个测试集合。

注意

要测试您使用 Quarkus 生成的原生可执行文件,请使用可用的 Maven 命令。没有等同的 Quarkus CLI 命令,可以使用命令行完成此任务。

流程

  • 针对已构建的原生可执行文件运行测试:

    ./mvnw test-compile failsafe:integration-test -Dnative
    Copy to Clipboard Toggle word wrap

    此命令使用 Failsafe Maven 插件针对现有的原生镜像运行测试。

  • 另外,您可以使用以下命令指定到原生可执行文件的路径,其中 < path> 是原生镜像路径:

    ./mvnw test-compile failsafe:integration-test -Dnative.image.path=<path>
    Copy to Clipboard Toggle word wrap

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部