Java使用GraalVM Native Image打包可执行程序

GraalVM Native Image 技术可提前将 Java 代码编译为自包含的可执行文件。只有应用程序运行时所需的代码才会添加到可执行文件中。这是一种提前(AOT)编译技术,可将Java字节码打包到独立的可执行文件中。此可执行文件是本机应用程序,与用户系统上的任何其他应用程序一样,通常可实现更快的启动时间,同时占用较小的空间。

说白了就是把运行环境给你打包了.

也就是说打包体积会很小,不需要考虑设备有没有java环境,也不需要带着笨重的 jre 了

安装过程有很多的坑,愿你们可以一次成功...

1. 安装 GraalVM 

官方下载地址:官网下载 GraalVM     仓库下载 graalvm/graalvm-ce-builds (github.com)

Spring支持Graalvm native-image 功能最低要求 springboot3.x ,而支持Springboot3.x功能的最低要求jdk17+  

注意官网主页只有Java17和20版本的,教程使用的是Java8的 (jdk8运行可能还需要带着jar包,jdk17的打包后可能只需二进制文件就可以运行),需要到这里下载:Oracle GraalVM Downloads

 【免费】graalvm-ee-java8-windows-amd64-21.3.7.zip资源-CSDN文库

要下载 GraalVM 社区版,请访问 GitHub 上的 GraalVM 版本存储库。选择 Java 版本(8、11 或 16)并下载。 

 下载完成后解压,修改配置Java的环境变量为解压的文件夹

 配置完环境变量后查看Java版本信息是否为GraalVM

java -version

2. 安装 Native Image

版本信息正确后执行命令安装 native-image

gu.cmd install native-image

也可以选择离线安装 

下载native-image Oracle GraalVM Downloads

执行安装命令

gu.cmd -L install native-image-installable-svm-svmee-java8-windows-amd64-21.3.7.jar

 检查是否安装成功

gu.cmd list

native-image

3. 安装 Visual Studio

需要安装运行环境 Visual Studio 和 Microsoft Visual C++ (MSVC)有两个安装选择:

* 使用 Windows 10 SDK 安装 Visual Studio Build Tools

* 使用 Windows 10 SDK 安装 Visual Studio

可以使用 Visual Studio 2017 版本 15.9 或更高版本。

下载Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com)  

Windows 10 SDK也可以。

注意:VS的安装盘符下会生成 Windows Kits 文件夹,如果找不到可以去注册表里面查看

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0

4. 设置环境变量

 ①新增 INCLUDE

D:\Windows Kits\10\Include\10.0.22621.0\ucrt
D:\Windows Kits\10\Include\10.0.22621.0\um
D:\Windows Kits\10\Include\10.0.22621.0\shared
D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\include

②新增 LIB

D:\Windows Kits\10\Lib\10.0.22621.0\um\x64
D:\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64
D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\lib\x64

 ③修改增加 Path

D:\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\bin\Hostx64\x64

执行脚本:构建器仅在从 x64 Native Tools Command Prompt 执行时才有效

D:\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat

 或者通过此命令提示符cd到项目路径:(此方式可以不用配置环境变量)

至此Windows就已经全部配置完成了

5. 进行exe打包测试

新建一个 HelloWorld.java

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

 编译class

javac HelloWorld.java

 在当前路径生成exe

native-image HelloWorld

jar包打包命令

native-image -jar demo.jar demo

springboot打包命令后面需要加的参数

--no-fallback --initialize-at-build-time=org.springframework.util.unit.DataSize --initialize-at-build-time=org.slf4j.MDC --initialize-at-build-time=ch.qos.logback.classic.Level --initialize-at-build-time=ch.qos.logback.classic.Logger --initialize-at-build-time=ch.qos.logback.core.util.StatusPrinter --initialize-at-build-time=ch.qos.logback.core.status.StatusBase --initialize-at-build-time=ch.qos.logback.core.status.InfoStatus --initialize-at-build-time=ch.qos.logback.core.spi.AppenderAttachableImpl --initialize-at-build-time=org.slf4j.LoggerFactory --initialize-at-build-time=ch.qos.logback.core.util.Loader --initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder --initialize-at-build-time=ch.qos.logback.classic.spi.ThrowableProxy --initialize-at-build-time=ch.qos.logback.core.CoreConstants --report-unsupported-elements-at-runtime --allow-incomplete-classpath -H:+ReportExceptionStackTraces

 native-image 部分命令参数

-jar:指定包含 Java 应用程序的 JAR 文件的位置。(还可以使用 -cp 指定类路径。)

--no-fallback:不生成回退映像。(回退映像需要 JVM 来运行它)

-H:Class:指定提供入口点方法的类(main 方法)

-H:Name:指定输出可执行文件的名称。

异常:

找不到 cl.exe 原因是 path 环境变量配置错误

找不到 某某.h 原因是 INCLUDE 环境变量配置错误

找不到 某某.lib 原因是 LIB 环境变量配置错误

示例:graalvm/graalvm-demos:此存储库包含几个小型应用程序。这些程序说明了GraalVM的功能 (github.com)

6. Linux版

与步骤1、2同理,OS版本选Linux,下载 GraalVM 和 Native Image。

解压

tar -zxvf graalvm-ee-java8-linux-amd64-21.3.7.tar.gz

修改Java环境变量

vi /etc/profile
export JAVA_HOME=/home/hang/graalvm-ee-java8-21.3.7/
export PATH=$PATH:$JAVA_HOME/bin

使生效

source /etc/profile.d/jdk.sh

查看是否生效

echo $JAVA_HOME
java -version

安装 Native Image

在线安装:

gu install native-image

 离线安装:

gu -L install native-image-installable-svm-svmee-java8-linux-amd64-21.3.7.jar

查看是否安装成功

gu list

安装必备工具
Linux(yum)使用sudo yum install gcc glibc-devel zlib-devel

Ubuntu(apt-get)使用sudo apt-get install build-essential libz-dev zlib1g-dev

其他(dnf)使用sudo dnf install gcc glibc-devel zlib-devel libstdc++-static

macOS(xcode)使用xcode-select --install

其他更多:https://www.graalvm.org/latest/reference-manual/native-image/#install-native-image

 打包命令同上

### 使用 GraalVM 将 Spring 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 或者解释器环境。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今晚哒老虎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值