将 Quarkus 应用程序编译到原生可执行文件


Red Hat build of Quarkus 1.11

摘要

本指南介绍了如何将 Quarkus Getting Started 项目编译成原生可执行文件以及如何配置和测试原生可执行文件。

前言

作为应用程序开发人员,您可以使用红帽构建的 Quarkus 创建在 OpenShift 和无服务器环境中运行的 Java 编写的微服务。编译到原生可执行文件的应用程序会占用较少的内存占用空间和快速启动时间。

本指南介绍了如何将 Quarkus Getting Started 项目编译成原生可执行文件以及如何配置和测试原生可执行文件。您需要 开始使用 Quarkus 时创建的应用程序。

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

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

先决条件

  • 已安装 OpenJDK (JDK) 11,并且设置了 JAVA_HOME 环境变量来指定 Java SDK 的位置。

    • 登录到红帽客户门户网站,从 Software Downloads 页面下载 Red Hat Open JDK 版本。
  • OCI (开源容器项目)兼容容器运行时,如 Podman 或 Docker。
  • 完成的 Quarkus 入门项目。

对红帽文档提供反馈

我们非常感谢您对我们的技术内容提供反馈,并鼓励您告诉我们您的想法。如果您想添加评论,提供见解、纠正拼写错误甚至询问问题,您可以在文档中直接这样做。

注意

您必须有一个红帽帐户并登录到客户门户网站。

要从客户门户网站提交文档反馈,请执行以下操作:

  1. 选择 Multi-page HTML 格式。
  2. 点文档右上角的 反馈 按钮。
  3. 突出显示您要提供反馈的文本部分。
  4. 点高亮文本旁的添加反馈对话框。
  5. 在页面右侧的文本框中输入您的反馈,然后单击 Submit

每次提交反馈时,我们都会自动创建跟踪问题。打开在点 Submit 后显示的链接,并开始监视问题或添加更多注释。

感谢您的宝贵反馈。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 生成原生可执行文件

您可以使用 Podman 或 Docker 等容器运行时从 Quarkus 应用程序生成原生可执行文件。Quarkus 使用构建器镜像生成二进制可执行文件,您可以和 Red Hat Universal Base Images RHEL8-UBI 和 RHEL8-UBI 最小一起使用。Red Hat build of Quarkus 1.11 使用 registry.access.redhat.com/quarkus/mandrel-20-rhel8:20.3 作为 quarkus.native.builder-image 属性的默认值。

应用程序的原生可执行文件包含应用程序代码、所需的库、Java API 和虚拟机(VM)的减少版本。较小的虚拟机基础改进了应用程序的启动时间,并生成最小的磁盘占用。

流程

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

    <profiles>
        <profile>
            <id>native</id>
            <properties>
                <quarkus.package.type>native</quarkus.package.type>
            </properties>
        </profile>
    </profiles>
    Copy to Clipboard Toggle word wrap
    注意

    使用 Quarkus native 配置集允许您运行原生可执行文件和原生镜像测试。

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

    1. 使用 Docker 构建原生可执行文件:

      ./mvnw package -Pnative -Dquarkus.native.container-build=true
      Copy to Clipboard Toggle word wrap
    2. 使用 Podman 构建原生可执行文件:

      ./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
      Copy to Clipboard Toggle word wrap

      这些命令在 目标 目录中创建 get-started the guestfish-runner 二进制文件。

      重要

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

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

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

    构建原生可执行文件时,启用了 prod 配置集,并使用 prod 配置集运行 Quarkus 原生测试。您可以使用 quarkus.test.native-image-profile 属性进行修改。

第 2 章 创建自定义容器镜像

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

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

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

2.1. 手动创建容器

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

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

FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3
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

CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
Copy to Clipboard Toggle word wrap
通用基础镜像(UBI)

Dockerfile 使用 UBI 作为基础镜像。此基础镜像设计为在容器中工作。Dockerfile 使用 基础镜像的最小版本 来缩小生成的镜像的大小。

流程

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

    1. 使用 Docker 构建原生可执行文件:

      ./mvnw package -Pnative -Dquarkus.native.container-build=true
      Copy to Clipboard Toggle word wrap
    2. 使用 Podman 构建原生可执行文件:

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

    1. 使用 Docker 构建容器镜像:

      docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
      Copy to Clipboard Toggle word wrap
    2. 使用 Podman 构建容器镜像

      podman build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
      Copy to Clipboard Toggle word wrap
  3. 运行容器:

    1. 使用 Docker 运行容器:

      docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
      Copy to Clipboard Toggle word wrap
    2. 使用 Podman 运行容器:

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

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

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

先决条件

流程

  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:

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

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

第 3 章 原生可执行配置属性

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

配置属性

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

Expand
属性描述类型Default(默认)

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

包含 Graal 分发的路径。

字符串

${GRAALVM_HOME:}

quarkus.native.java-home

包含 JDK 的路径。

File

${java.home}

quarkus.native.native-image-xmx

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

字符串

 

quarkus.native.debug-build-process

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

布尔值

false

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

使用 docker 构建和 debug-build-process 为 true 时发布调试端口。

布尔值

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 镜像。

字符串

registry.access.redhat.com/quarkus/mandrel-20-rhel8:20.3

quarkus.native.container-runtime

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

字符串

 

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

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

字符串列表

 

quarkus.native.debug.enabled

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

布尔值

false

支持的 glob 功能及其描述

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

Expand

字符

功能描述

*

匹配不含斜杠(/)的字符的空序列。

**

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

?

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

[abc]

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

[a-z]

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

[!ABC]

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

[a-z]

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

{one,two,three}

匹配用逗号分开的任何更改令牌;令牌可能包含通配符、嵌套更改和范围。

\

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

3.1. 为 Quarkus 原生编译配置内存消耗

在分析和优化过程中,将 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 -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.native-image-xmx=<maximum_memory>
      Copy to Clipboard Toggle word wrap

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

注意

例如,要将内存限制设置为 6 GB,请输入 quarkus.native.native-image-xmx=6g。该值必须是大于 2MB 的 1024 的倍数。附加字母 m 或 M 以表示 MB,或 g 或 G 来表示 GB。

第 4 章 测试原生可执行文件

测试以原生模式运行的应用程序,以测试原生可执行文件的功能。使用 @NativeImageTest 注释来构建原生可执行文件,并根据 http 端点运行测试。

流程

  1. 打开 pom.xml 文件,并验证 native 配置集是否包含以下元素:

    <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

    failsafe-maven-plugin 运行集成测试,并指示生成的原生可执行文件的位置。

  2. 打开 src/test/java/org/acme/quickstart/NativeGreetingResourceIT.java 文件,并验证该文件是否包含以下内容:

    package org.acme.quickstart;
    
    
    import io.quarkus.test.junit.NativeImageTest;
    
    @NativeImageTest 
    1
    
    public class NativeGreetingResourceIT extends GreetingResourceTest { 
    2
    
    
        // Run the same tests
    
    }
    Copy to Clipboard Toggle word wrap
    1
    在测试前,使用从原生文件启动应用程序的另一个测试运行程序。可执行文件使用 Failsafe Maven 插件 中配置的 native.image.path 系统属性检索。
    2
    这个示例扩展了 GreetingResourceTest,但您也可以创建新的测试。
  3. 运行测试:

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

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

    ./mvnw verify -Pnative
    ...
    [getting-started-1.0-SNAPSHOT-runner:18820]     universe:     587.26 ms
    [getting-started-1.0-SNAPSHOT-runner:18820]      (parse):   2,247.59 ms
    [getting-started-1.0-SNAPSHOT-runner:18820]     (inline):   1,985.70 ms
    [getting-started-1.0-SNAPSHOT-runner:18820]    (compile):  14,922.77 ms
    [getting-started-1.0-SNAPSHOT-runner:18820]      compile:  20,361.28 ms
    [getting-started-1.0-SNAPSHOT-runner:18820]        image:   2,228.30 ms
    [getting-started-1.0-SNAPSHOT-runner:18820]        write:     364.35 ms
    [getting-started-1.0-SNAPSHOT-runner:18820]      [total]:  52,777.76 ms
    [INFO]
    [INFO] --- maven-failsafe-plugin:2.22.1:integration-test (default) @ getting-started ---
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running org.acme.quickstart.NativeGreetingResourceIT
    Executing [/data/home/gsmet/git/quarkus-quickstarts/getting-started/target/getting-started-1.0-SNAPSHOT-runner, -Dquarkus.http.port=8081, -Dtest.url=http://localhost:8081, -Dquarkus.log.file.path=build/quarkus.log]
    2019-04-15 11:33:20,348 INFO  [io.quarkus] (main) Quarkus 999-SNAPSHOT started in 0.002s. Listening on: http://[::]:8081
    2019-04-15 11:33:20,348 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]
    [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.387 s - in org.acme.quickstart.NativeGreetingResourceIT
    ...
    Copy to Clipboard Toggle word wrap
    注意

    Quarkus 在自动失败原生测试前等待 60 秒启动。您可以使用 quarkus.test.native-image-wait-time 系统属性更改此持续时间。

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

    ./mvnw verify -Pnative -Dquarkus.test.native-image-wait-time=<duration>
    Copy to Clipboard Toggle word wrap

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

当针对原生应用程序运行测试时,您只能与其 HTTP 端点交互。测试不原生运行,因此它们无法链接应用程序代码,就像它们在 JVM 上运行一样。

您可以在 JVM 和原生执行间共享您的测试类,并使用 @DisabledOnNativeImage 注解排除某些测试,使其仅在 JVM 上运行。

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

您可以针对现有的可执行文件构建进行测试。这可让您在构建后在二进制文件中运行多个测试集合。

流程

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

    ./mvnw test-compile failsafe:integration-test
    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

第 5 章 其他资源

更新于 2023-05-16

法律通告

Copyright © 2023 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
返回顶部