第 1 章 将 Quarkus 应用程序编译到原生可执行文件
作为应用程序开发人员,您可以使用红帽构建的 Quarkus 创建使用 OpenShift Container Platform 和无服务器环境中运行的 Java 编写的微服务。编译到原生可执行文件的应用程序具有较少的内存占用率和快速启动时间。
本指南演示了如何将 Quarkus Getting Started 项目编译到原生可执行文件中,以及如何配置和测试原生可执行文件。您需要在 Getting started with Quarkus 中创建的应用程序。
使用 Red Hat build of Quarkus 构建原生可执行文件涵盖了:
- 使用 Podman 或 Docker 等容器运行时(如 Podman 或 Docker)通过单个命令构建原生可执行文件
- 使用生成的原生可执行文件创建自定义容器镜像
- 使用 OpenShift Container Platform Docker 构建策略创建容器镜像
- 将 Quarkus 原生应用程序部署到 OpenShift Container Platform
- 配置原生可执行文件
- 测试原生可执行文件
先决条件
安装了 OpenJDK 17,并且设置了
JAVA_HOME环境变量,以指定 Java SDK 的位置。- 登录到红帽客户门户网站,从 Software Downloads 页面下载红帽构建的 OpenJDK。
- 一个兼容开放容器项目(OCI)的容器运行时,如 Podman 或 Docker。
已完成的 Quarkus 入门项目。
- 要了解如何构建 Quarkus Getting Started 项目,请参阅开始使用 Quarkus。
-
或者,您可以下载 Quarkus Quickstart 归档 或克隆
Quarkus QuickstartsGit 存储库。示例项目处于getting-started目录中。
1.1. 生成原生可执行文件 复制链接链接已复制到粘贴板!
原生二进制文件是创建在特定操作系统(OS)或 CPU 架构上运行的可执行文件。
以下列表概述了原生可执行文件的一些示例:
- Mac 的通用二进制文件
- Linux 的 ELF 二进制文件
- Windows 的 EXE 二进制文件
构建原生可执行文件时,您的应用程序和依赖项(包括 JVM)被打包到一个文件中。应用程序的原生可执行文件包含以下项目:
- 编译的应用程序代码
- Java API
- 所需的库
- 用于改进应用程序启动时间和最小磁盘和内存占用量的 Java 虚拟机(JVM)的减少版本
要从 Quarkus 应用生成原生可执行文件,您可以选择容器内构建或 local-host 构建。下表解释您可以使用的不同构建选项:
| 构建选项 | Requires | 使用 | 结果 | 优点 |
|---|---|---|---|---|
| in-container build - Supported | 容器运行时,如 Podman 或 Docker |
默认 | Linux 64 位可执行文件 | GraalVM 不需要在本地设置,从而使 CI 管道 更有效地运行 |
| local-host build - 仅支持上游 | GraalVM 或 Mandrel 的本地安装 |
其本地安装作为 | 具有与执行构建的机器相同的操作系统和 CPU 架构的可执行文件 | 不允许或不想使用 Docker 或 Podman 等工具的开发人员的替代方案。总体比容器更快。 |
红帽构建的 Quarkus 2.13 仅支持基于 Java 17 的 Mandrel 22.3 基础镜像构建原生可执行文件。
虽然其他镜像在社区中可用,但产品不支持它们,因此您不应该将其用于您希望红帽提供支持的生产构建。
其源基于 Java 11 编写的应用程序(不使用 Java 12 - 17 的功能),仍可使用基于 Java 17 的 Mandrel 22.3 基础镜像编译应用程序的原生可执行文件。
Red Hat build of Quarkus 支持使用 红帽构建的 Quarkus 原生构建器镜像构建原生 Linux 可执行文件,这是 Mandrel 的产品化分发。如需更多信息,请参阅将 Quarkus 应用程序编译到原生可执行文件。使用红帽构建的 Quarkus 不支持使用 Oracle GraalVM 社区版(CE)、Mael 社区版本或任何其他 GraalVM 发行版构建原生可执行文件。
1.1.1. 使用 in-container 构建生成原生可执行文件 复制链接链接已复制到粘贴板!
要创建原生可执行文件并运行原生镜像测试,请使用由红帽构建的 Quarkus 提供的 原生 配置集进行容器内构建。
先决条件
- podman 或 Docker 已安装。
- 容器可以访问至少 8GB 内存。
流程
打开 Getting Started project
pom.xml文件,并验证项目是否包含native配置集:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下方法之一构建原生可执行文件:
使用 Maven:
对于 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
使用 Quarkus CLI:
对于 Docker:
quarkus build --native -Dquarkus.native.container-build=true
quarkus build --native -Dquarkus.native.container-build=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于 Podman:
quarkus build --native -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
quarkus build --native -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 步骤结果
这些命令在目标目录中创建一个
*-runner二进制文件,其中适用以下内容:-
*-runner文件是由 Quarkus 生成的构建原生二进制文件。 目标目录是一个目录,Maven 会在构建 Maven 应用程序时创建该目录。重要将 Quarkus 应用程序编译到原生可执行文件会在分析和优化过程中消耗大量内存。您可以通过设置
quarkus.native.native-image-xmx配置属性来限制原生编译过程中使用的内存量。设置低内存限值可能会增加构建时间。
要运行原生可执行文件,请输入以下命令:
./target/*-runner
./target/*-runnerCopy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
如需更多信息,请参阅 将 Quarkus 应用程序编译到原生可执行文件 中的"Native executable 配置属性"。
1.1.2. 使用 local-host 构建生成原生可执行文件 复制链接链接已复制到粘贴板!
如果您不使用 Docker 或 Podman,请使用 Quarkus local-host build 选项来创建和运行原生可执行文件。
使用本地主机构建方法比使用容器更快,并适用于使用 Linux 操作系统的机器。
红帽构建的 Quarkus 不支持在生产环境中使用以下步骤。只有在 Docker 或 Podman 不可用时,才使用这个方法测试或作为备份方法。
先决条件
Mandrel 或 GraalVm 的本地安装,根据 构建原生可执行文件 指南进行了正确配置。
-
另外,对于 GraalVM 安装,还必须安装
native-image。
-
另外,对于 GraalVM 安装,还必须安装
流程
对于 GraalVM 或 Mandrel,使用以下方法之一构建原生可执行文件:
使用 Maven:
./mvnw package -Pnative
./mvnw package -PnativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Quarkus CLI:
quarkus build --native
quarkus build --nativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 步骤结果
这些命令在目标目录中创建一个
*-runner二进制文件,其中适用以下内容:-
*-runner文件是由 Quarkus 生成的构建原生二进制文件。 目标目录是一个目录,Maven 会在构建 Maven 应用程序时创建该目录。注意构建原生可执行文件时,会启用
prod配置集,除非在quarkus.profile属性中修改了。
-
运行原生可执行文件:
./target/*-runner
./target/*-runnerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意-
除非在
quarkus.test.native-image-profile属性中修改了,否则会使用prod配置集运行原生测试。
-
除非在
其他资源
如需更多信息,请参阅 Producing a native executable。