GraalVM编译SpringBoot程序

GraalVM 提供了一个名为 “Native Image” 的工具,它能够将 Java 应用程序预编译成本机可执行文件。这种方法的优点是启动速度快,内存占用少,因为程序运行时不需要 JVM 和类加载。

然而这种方式也存在一些弊端,如预编译的 GraalVM Native Image 相比于在 HotSpot JVM 上运行的相同程序,它没有一个先进的即时编译器 (JIT) ,因此就不能在运行时分析和优化代码,无法利用这些运行时优化,因此在性能表现上可能会有所降低。

本文接下来将教你如何使用 GraalVM 编译 SpringBoot 程序。

文章目录:

  • 本机(或虚拟机)上安装 GraalVM JDK17
  • 安装一些编译工具
  • 编译 SpringBoot 程序

一、本机(或虚拟机)上安装 GraalVM JDK17

注意:本机(或虚拟机)最低配置必须为 CPU 2 核心以上,运行内存 4GB 以上的硬性条件。否则在后面的编译过程中,很有可能会因为资源不足而触发编译失败。

访问 GraalVm for GitHub 链接,下载你需要的 JDK:https://github.com/graalvm/graalvm-ce-builds/releases/。这里因为我本机是 MacOS 系统,且 CPU 是 ARM 架构的,所以我选择下载macOS (aarch64) † JDK17(大家依据自己实际情况进行下载即可):

image-20230501221201674

下载完毕之后,安装 JDK。这里由于篇幅关系,我不对安装 JDK 作过多介绍,简单来说就是解压文件、配置 JAVA_HOME 与 PATH 路径。

安装完 GraalVm JDK 之后,我们应该能在命令行上直接运行指令 java -version。此外,还能运行命令 gu list,如果你这两项都没问题,那么安装成功。

gu 是 GraalVM 的组件安装器 (GraalVM Updater),你可以使用 gu 来安装、列出和卸载 GraalVM 中的各种组件。

image-20230501222104198

二、安装一些编译工具

  1. 安装 native-image

    native-image 是 GraalVM 提供的一个工具,它可以将 Java 应用程序预编译为本机可执行文件,这样生成的文件可以直接运行,无需 JVM 或者任何其他的运行时环境。

    在这里,我们需要借助 gu 来安装 native-image,具体如下:

    友情提示:需要访问外网

    gu install native-image
    

    image-20230501222346194

  2. 安装gccglibc-develzlib-devel

    如果你是 MacOS 系统,请运行:

    brew install gcc zlib
    

    如果你是 CentOS 系统,请运行:

    yum install -y gcc glibc-devel zlib-devel
    

    如果你是 Ubuntu 系统,请运行:

    sudo apt install gcc libc6-dev zlib1g-dev
    

三、编译 SpringBoot 程序

上面两步全部运行成功之后,我们随意选择一个 Spring Boot 项目(必须是 SpringBoot 3.0 版本以上 + JDK17),比如我这里新建了一个 hello_graalvm 项目。进入项目主目录,命令行执行 mvn -Pnative native:compile ,等待 5~10 分钟,程序会自动在 /target 目录下生成一个本机可直接执行的文件,直接就能运行,教程结束。

cd hello_graalvm
mvn -Pnative native:compile
# 运行新生成的可执行程序
./hello_graalvm

image-20230501223041206

image-20230501223438521

### 使用 GraalVMSpring Boot 应用程序打包成本地可执行文件 #### 安装和配置 GraalVM 为了使用 GraalVM 打包 Spring Boot 应用程序,首先需要安装并配置 GraalVM 环境。进入官方下载页面获取适用于 Windows 11 的版本,并按照说明完成解压缩操作[^1]。 接着设置环境变量以便命令行工具能够识别到 GraalVM: - `GRAALVM_HOME` 设置为 GraalVM 解压后的根目录路径。 - 更新系统的 PATH 变量,加入 `%GRAALVM_HOME%\bin`。 验证安装成功与否可以通过运行如下命令来确认: ```bash gu --version ``` 这一步骤确保了后续构建过程中所需的 Native Image 工具链可用。 #### 准备 Spring Boot 项目 创建一个新的或打开现有的基于 Spring Boot 3.x 版本的应用程序。考虑到 AOT (Ahead-of-Time Compilation) 支持可以显著提升性能表现,建议利用这一特性优化应用结构。 在项目的 pom.xml 文件中添加必要的依赖项以支持本地镜像编译功能以及任何其他所需插件: ```xml <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-aot-maven-plugin</artifactId> <version>${aot.version}</version> </dependency> <!-- 添加 native-image 插件 --> <build> ... <plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <!-- 配置参数省略 --> </plugin> </plugins> </build> ``` 上述 XML 片段展示了如何引入 Maven 插件用于处理提前编译逻辑和服务于生成原生映像的任务。 #### 编写应用程序代码 编写业务逻辑部分时需要注意某些反射调用可能不被完全兼容;因此尽可能采用静态方法或者通过代理模式间接访问动态组件。对于那些不可避免的情况,则需显式声明保留这些类及其成员免受修剪机制的影响。 例如,在 application.properties 中指定要保持的类列表: ```properties graalvm.native.reflection-config=classpath:/META-INF/native-image/**/reflect.json ``` 同时提供相应的 JSON 文件定义具体规则。 #### 构建本地可执行文件 一切准备就绪之后,就可以着手进行最终步骤——实际构建过程。此阶段涉及两个主要环节:一是常规的 Java 字节码编译,二是转换为目标平台上的机器指令集表示形式。 执行以下 Maven 命令触发整个流程: ```bash mvn clean package -Pnative ``` 该选项会自动激活之前提到过的 native-profile 并启动完整的构建管线直至产出目标产物为止。 一旦顺利完成以上所有工作,将会得到一个独立的 .exe 文件作为输出成果物,可以直接分发给终端用户而无需额外携带 JVM 或者解释器环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThinkStu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值