将 Quarkus 应用程序编译到原生可执行文件
前言 复制链接链接已复制到粘贴板!
作为应用程序开发人员,您可以使用红帽构建的 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 入门项目。
- 要了解如何构建 Quarkus 入门项目,请参阅开始使用 Quarkus。
-
或者,您可以下载 Quarkus Quickstart 归档 或克隆
Quarkus QuickstartsGit 存储库。示例项目位于 get-started目录中。
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们非常感谢您对我们的技术内容提供反馈,并鼓励您告诉我们您的想法。如果您想添加评论,提供见解、纠正拼写错误甚至询问问题,您可以在文档中直接这样做。
您必须有一个红帽帐户并登录到客户门户网站。
要从客户门户网站提交文档反馈,请执行以下操作:
- 选择 Multi-page HTML 格式。
- 点文档右上角的 反馈 按钮。
- 突出显示您要提供反馈的文本部分。
- 点高亮文本旁的添加反馈对话框。
- 在页面右侧的文本框中输入您的反馈,然后单击 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)的减少版本。较小的虚拟机基础改进了应用程序的启动时间,并生成最小的磁盘占用。
流程
打开 Getting Started 项目
pom.xml文件,并验证该文件是否包含native配置集:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意使用 Quarkus
native配置集允许您运行原生可执行文件和原生镜像测试。使用以下方法之一构建原生可执行文件:
使用 Docker 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true
./mvnw package -Pnative -Dquarkus.native.container-build=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Podman 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这些命令在
目标目录中创建get-started the guestfish-runner二进制文件。重要在分析和优化过程中,将 Quarkus 应用程序编译到原生可执行文件中会消耗大量内存。您可以通过设置
quarkus.native.native-image-xmx配置属性来限制原生编译过程中使用的内存量。设置低内存限值可能会增加构建时间。如需了解更多详细信息,请参阅 原生可执行配置属性。
运行原生可执行文件:
./target/getting-started-*-runner
./target/getting-started-*-runnerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 构建原生可执行文件时,启用了
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,其内容如下:
Dockerfile 使用 UBI 作为基础镜像。此基础镜像设计为在容器中工作。Dockerfile 使用 基础镜像的最小版本 来缩小生成的镜像的大小。
流程
使用以下方法之一构建原生 Linux 可执行文件:
使用 Docker 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true
./mvnw package -Pnative -Dquarkus.native.container-build=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Podman 构建原生可执行文件:
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
使用以下方法之一构建容器镜像:
使用 Docker 构建容器镜像:
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Podman 构建容器镜像
podman build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .
podman build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/getting-started .Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行容器:
使用 Docker 运行容器:
docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-startedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Podman 运行容器:
podman run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
podman run -i --rm -p 8080:8080 quarkus-quickstart/getting-startedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.2. 使用 OpenShift Docker 构建创建容器 复制链接链接已复制到粘贴板!
您可以使用 OpenShift Docker 构建策略为 Quarkus 应用程序创建容器镜像。此策略使用集群中的构建配置创建容器。
先决条件
- 您可以访问 Red Hat OpenShift Container Platform 集群,并安装最新版本的 OpenShift CLI (oc)。有关安装 oc 的详情,请参考 安装和配置 OpenShift Container Platform 集群指南中的"安装和配置 CLI"部分。
- OpenShift API 端点的 URL。
流程
登录到 OpenShift CLI:
oc login -u <username_url>
oc login -u <username_url>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 OpenShift 中创建新项目:
oc new-project <project_name>
oc new-project <project_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据
src/main/docker/Dockerfile.native文件创建构建配置:cat src/main/docker/Dockerfile.native | oc new-build --name <build_name> --strategy=docker --dockerfile -
cat src/main/docker/Dockerfile.native | oc new-build --name <build_name> --strategy=docker --dockerfile -Copy to Clipboard Copied! Toggle word wrap Toggle overflow 构建项目:
oc start-build <build_name> --from-dir .
oc start-build <build_name> --from-dir .Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将项目部署到 OpenShift:
oc new-app <build_name>
oc new-app <build_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 公开服务:
oc expose svc/<build_name>
oc expose svc/<build_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 3 章 原生可执行配置属性 复制链接链接已复制到粘贴板!
配置属性定义如何生成原生可执行文件。您可以使用 application.properties 文件配置 Quarkus 应用程序。
配置属性
下表列出了您可以设置的配置属性,以定义如何生成原生可执行文件:
| 属性 | 描述 | 类型 | Default(默认) |
|---|---|---|---|
|
| 传递给构建过程的其他参数。 | 字符串列表 | |
|
| 启用 HTTP URL 处理程序。这可让您为 HTTP URL 进行 URL.openConnection ()。 | 布尔值 |
|
|
| 启用 HTTPS URL 处理程序。这可让您为 HTTPS URL 执行 URL.openConnection ()。 | 布尔值 |
|
|
| 将所有安全服务添加到原生镜像。 | 布尔值 |
|
|
| 将所有字符集添加到原生镜像。这会增加镜像大小。 | 布尔值 |
|
|
| 包含 Graal 分发的路径。 | 字符串 |
|
|
| 包含 JDK 的路径。 |
| |
|
| 用于生成原生镜像的最大 Java 堆。 | 字符串 | |
|
| 在运行原生镜像构建前,等待调试器附加到构建过程。这是熟悉 GraalVM 内部的用户的高级选项。 | 布尔值 |
|
|
| 使用 docker 构建和 debug-build-process 为 true 时发布调试端口。 | 布尔值 |
|
|
| 重启原生镜像服务器。 | 布尔值 |
|
|
| 启用隔离以改进内存管理。 | 布尔值 |
|
|
| 如果原生镜像失败,则创建基于 JVM 的回退镜像。 | 布尔值 |
|
|
| 使用原生镜像服务器。这可能会加快编译速度,但可能导致因为缓存不一致的问题而丢弃更改。 | 布尔值 |
|
|
| 自动注册所有 META-INF/services 条目。 | 布尔值 |
|
|
| 转储所有代理进行检查的字节码。 | 布尔值 |
|
|
| 使用容器运行时构建。Docker 默认使用。 | 布尔值 |
|
|
| 构建镜像的 docker 镜像。 | 字符串 |
|
|
| 用于构建镜像的容器运行时。例如,Docker。 | 字符串 | |
|
| 传递给容器运行时的选项。 | 字符串列表 | |
|
| 在镜像中启用虚拟机内省。 | 布尔值 |
|
|
| 在镜像中启用完整的堆栈跟踪。 | 布尔值 |
|
|
| 生成调用路径和包含的软件包/类/方法的报告。 | 布尔值 |
|
|
| 报告带有完整堆栈追踪的例外。 | 布尔值 |
|
|
| 在运行时报告错误。如果您使用不支持的功能,这可能会导致您的应用程序在运行时失败。 | 布尔值 |
|
|
|
以逗号分隔的 globs 列表,以匹配应添加到原生镜像的资源路径。在所有平台上使用斜杠( | 字符串列表 | |
|
|
启用调试并在单独的 .debug 文件中生成调试符号。与 | 布尔值 |
|
支持的 glob 功能及其描述
下表列出了支持的 glob 功能及其描述:
| 字符 | 功能描述 |
|
|
匹配不含斜杠( |
|
|
匹配可能包含斜杠( |
|
| 匹配一个字符,但不匹配斜杠。 |
|
| 匹配括号中指定的范围中的一个字符,但不匹配斜杠。 |
|
| 匹配括号中指定的范围中的一个字符,但不匹配斜杠。 |
|
| 匹配括号中没有指定的字符;不匹配斜杠。 |
|
| 匹配括号中指定的范围之外的一个字符;不匹配斜杠。 |
|
| 匹配用逗号分开的任何更改令牌;令牌可能包含通配符、嵌套更改和范围。 |
|
|
转义字符。有三个转义级别: |
3.1. 为 Quarkus 原生编译配置内存消耗 复制链接链接已复制到粘贴板!
在分析和优化过程中,将 Quarkus 应用程序编译到原生可执行文件中会消耗大量内存。您可以通过设置 quarkus.native.native-image-xmx 配置属性来限制原生编译过程中使用的内存量。设置低内存限值可能会增加构建时间。
流程
使用以下方法之一为
quarkus.native.native-image-xmx属性设置值,以便在原生镜像构建期间限制内存消耗:使用
application.properties文件:quarkus.native.native-image-xmx=<maximum_memory>
quarkus.native.native-image-xmx=<maximum_memory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置系统属性:
mvn -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.native-image-xmx=<maximum_memory>
mvn -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.native-image-xmx=<maximum_memory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令使用 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 端点运行测试。
流程
打开
pom.xml文件,并验证native配置集是否包含以下元素:Copy to Clipboard Copied! Toggle word wrap Toggle overflow failsafe-maven-plugin运行集成测试,并指示生成的原生可执行文件的位置。打开
src/test/java/org/acme/quickstart/NativeGreetingResourceIT.java文件,并验证该文件是否包含以下内容:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行测试:
./mvnw verify -Pnative
./mvnw verify -PnativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下示例显示了这个命令的输出:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意Quarkus 在自动失败原生测试前等待 60 秒启动。您可以使用
quarkus.test.native-image-wait-time系统属性更改此持续时间。您可以使用以下命令来扩展等待时间,其中 <
duration> 是等待的时间(以秒为单位):./mvnw verify -Pnative -Dquarkus.test.native-image-wait-time=<duration>
./mvnw verify -Pnative -Dquarkus.test.native-image-wait-time=<duration>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1. 作为原生可执行文件运行时排除测试 复制链接链接已复制到粘贴板!
当针对原生应用程序运行测试时,您只能与其 HTTP 端点交互。测试不原生运行,因此它们无法链接应用程序代码,就像它们在 JVM 上运行一样。
您可以在 JVM 和原生执行间共享您的测试类,并使用 @DisabledOnNativeImage 注解排除某些测试,使其仅在 JVM 上运行。
4.2. 测试现有的原生可执行文件 复制链接链接已复制到粘贴板!
您可以针对现有的可执行文件构建进行测试。这可让您在构建后在二进制文件中运行多个测试集合。
流程
针对已构建的原生可执行文件运行测试:
./mvnw test-compile failsafe:integration-test
./mvnw test-compile failsafe:integration-testCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令使用 Failsafe Maven 插件针对现有的原生镜像运行测试。
另外,您可以使用以下命令指定原生可执行文件的路径,其中 <
path>是原生镜像路径:./mvnw test-compile failsafe:integration-test -Dnative.image.path=<path>
./mvnw test-compile failsafe:integration-test -Dnative.image.path=<path>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 5 章 其他资源 复制链接链接已复制到粘贴板!
更新于 2023-05-16