1.10. JVM 和原生构建模式
您可以编译经典 Java 虚拟机(JVM)应用程序,或使用 Mandrel 或 GraalVM 的原生 镜像工具编译原生
应用程序。
1.10.1. 将应用程序编译为典型的 JVM 应用
您可以将应用程序编译为 JVM 应用。此选项基于 quarkus.package.jar.type
配置属性。将此属性设置为指定要生成的 JAR 文件格式:
-
fast-jar
: 为 Quarkus 优化的 JAR 文件和默认配置选项。启动时间稍快,并且稍微降低内存用量。 -
legacy-jar
: 典型的 JAR 文件。此文件已弃用,而不是首选选项。 -
mutable-jar
: 用于原生镜像容器构建的 JAR 文件。 uber-jar
: 单个独立 JAR 文件。这些文件在所有操作系统上工作,构建要快于原生映像。
1.10.2. 将应用程序编译到原生镜像中
要构建原生镜像,请将 quarkus.native.enabled
设置为 true
。
这样,您可以创建一个专门用于您选择的操作系统(如 Windows 的 .exe
文件)的可执行二进制文件。与 JAVA JAR 文件相比,这些文件的启动时间和较少的 RAM 消耗要快,但它们的编译需要几分钟。此外,使用原生二进制文件可以的最大吞吐量低于常规 JVM 应用,因为缺少 profile-guided 优化。
使用 Mandrel
Mandrel 是红帽构建的 Quarkus 的 GraalVM 专用发行版,也是构建目标 Linux 容器化环境的原生可执行文件的首选方法。虽然 Mandrel 方法非常适合在容器化环境中嵌入编译输出,但只会提供一个 Linux64 位原生可执行文件。因此,
.exe
等结果不是一个选项。鼓励 Mandrel 用户使用容器来构建其原生可执行文件。
要使用官方 Mandrel 镜像,通过本地安装 Docker 或 Podman 将应用程序编译为原生模式,请输入具有以下属性的
mvn package
命令:使用 Maven:
对于 Docker:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./mvnw package -Dnative -Dquarkus.native.enabled=true
./mvnw package -Dnative -Dquarkus.native.enabled=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./mvnw package -Dnative -Dquarkus.native.container-build=true
./mvnw package -Dnative -Dquarkus.native.container-build=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./mvnw package -Dnative -Dquarkus.native.builder-image=registry.access.redhat.com/quarkus/mandrel-for-jdk-21-rhel8:23.1
./mvnw package -Dnative -Dquarkus.native.builder-image=registry.access.redhat.com/quarkus/mandrel-for-jdk-21-rhel8:23.1
对于 Podman (可选):
红帽构建的 Quarkus 会自动检测容器运行时。但是,如果要强制使用特定的容器运行时,请手动指定一个。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./mvnw package -Dnative -Dquarkus.native.enabled=true -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
./mvnw package -Dnative -Dquarkus.native.enabled=true -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./mvnw package -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
./mvnw package -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./mvnw package -Dnative -Dquarkus.native.builder-image=registry.access.redhat.com/quarkus/mandrel-for-jdk-21-rhel8:23.1 Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
./mvnw package -Dnative -Dquarkus.native.builder-image=registry.access.redhat.com/quarkus/mandrel-for-jdk-21-rhel8:23.1 Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=podman
步骤结果
这些命令在目标目录中创建一个
*-runner
二进制文件,在其中应用以下内容:-
*-runner
文件是 Quarkus 生成的构建原生二进制文件。 -
目标目录
是构建 Maven 应用程序时 Maven 创建的目录。
-
使用 GraalVM
因为 Mandrel 不支持 macOS,所以您可以使用 Oracle GraalVM 在此操作系统上构建原生可执行文件。
您还可以通过直接在裸机 Linux 或 Windows 发行版上使用 Oracle GraalVM 来构建原生可执行文件。
有关如何使用 Oracle GraalVM 构建原生可执行文件的详情,请参考 将 Quarkus 应用程序的红帽构建的 Quarkus 应用程序编译到原生可执行文件。
其他资源
- 有关如何使用 Mandrel 构建原生可执行文件的详情,请参考 将 Quarkus 应用程序的红帽构建的 Quarkus 应用程序编译到原生可执行文件。
- 有关可用 Mandrel 镜像列表,请参阅 Available Mandrel images。
- 有关构建、编译、打包和调试原生可执行文件的更多信息,请参阅 构建原生可执行文件。
- 有关帮助排除尝试作为原生可执行文件运行 Java 应用程序时可能会出现的问题,请参阅 编写原生应用程序的提示。