1.12. 生成原生可执行文件


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

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

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

红帽构建的 Quarkus 仅支持 Linux AMD 64 位的 ELF 二进制文件。

构建原生可执行文件时,您的应用程序和依赖项(包括 JVM)被打包到一个文件中。应用程序的原生可执行文件包含以下项目:

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

要从 Quarkus 应用生成原生可执行文件,您可以选择容器内构建或 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.8 仅支持使用基于 Java 21 的 红帽构建的 Quarkus 原生构建器镜像构建原生 Linux 可执行文件,这是 Mandrel 的一个产品化发行版本。虽然其他镜像在社区中可用,但产品不支持它们,因此您不应该将其用于您希望红帽提供支持的生产构建。
  • 其源基于 17 (不使用 Java 18 - 21 的功能)编写的应用程序仍然可以使用基于 Java 21 的 Mandrel 23.1 基础镜像编译应用程序的原生可执行文件。
  • 使用红帽构建的 Quarkus 不支持使用 Oracle GraalVM 社区版(CE)、Mael 社区版本或任何其他 GraalVM 发行版构建原生可执行文件。

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

先决条件

  • podman 或 Docker 已安装。
  • 容器可以访问至少 8GB 内存。

流程

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

    <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.12.2. 使用 local-host 构建生成原生可执行文件

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

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

重要

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

先决条件

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

    • 另外,对于 GraalVM 安装,还必须安装 native-image

流程

  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.12.3. 手动创建容器

您可以使用应用程序为 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.9
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.9
    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.9
    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
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat