手把手将你的Java maven项目通过GraalVM打包成windows可执行程序
1. 背景相关
作为一个程序员,总是会在工作的时候开发一些方便自己工作的程序,但是作为一个Java程序员,给自己或者朋友开发的办公小程序总是使用一个Jar包并不是一个很好的体验,主要是:
- 启动不方便
- 需要Java环境
- 有时候打出来的Jar比较大,不便于分享传输
但是现在有了GraalVM,让这些都不是问题了,直接生成可执行程序,丢哪哪就能用
2. GraalVM
GraalVM是一款高性能的虚拟机,它能够直接将Java程序编译成本地可执行文件,可以在不安装JVM的情况下运行程序。当然了它的特性远不止这些,比如支持多语言,更低的内存占用等等,但这些并不是这篇博客所涉及的,有兴趣可以去他们的官网里了 解一下。
安装GraalVM JDK
下载界面:https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-22.3.1
这里用到的是Java 17版本:
下载完成之后,放入你本地的JDK目录,例如:
接着配置环境变量
简单的通过cmd测试一下
安装native-image
Native Image是一种将Java代码提前编译为独立可执行文件的技术,此刻执行文件包括应用程序类、依赖、运行时库以及JDK静态连接的本机代码。 Graalvm通过子模块SubstrateVM来支持Native Image,相比JVM其生成的程序具有更快的启动时间 和更低的运行时开销。
需要在管理员模式下打开一个cmd窗口,然后执行:
gu install native-image
3. 安装Visual studio
为了打包成exe可执行程序,这一步也是不可避免需要做的,这里推荐安装2019版本之后的,我安装的是visual studio 2022,下载地址:https://visualstudio.microsoft.com/zh-hans/vs/
安装完成以后我们还需要一些配置,不然直接进行打包会失败
配 置cl.exe到系统的环境变量
安装完Visual studio后,你可以通过我的路径匹配找到你的cl.exe
的路径,并配置cl.exe到系统的环境变量**。**
C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x64
如果有问题:可以参考我之前踩过的坑:
【已解决】Default native-compiler executable 'cl.exe' not found via environment variable PATH
4. 将一个简单的Java应用打包成可执行程序
这里以一个简单的Java应用举例,它的功能是将剪切板上的一大串的xml文本解析为排序后的xml,然后重新放回剪切板,方便我们平时在工作的时候对xml进行对比。
代码已经放在github,有需要的可以自取:https://github.com/MingGH/clip-sort-xml
你可能不信,代码主要部分是ChatGPT写出来的,我只做了获取剪切板内容和放入剪切板这两个方法。。
添加graal-sdk依赖
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>21.3.0</version>
<scope>provided</scope>
</dependency>
对maven项目使用跟踪代理生成反射配置
有了代码之后,我们需要对maven项目使用跟踪代理生成反射配置
需要先把你的代码打成jar包,虽然这里并不是SpringBoot项目,但是我使用的是spring-boot-maven-plugin对项目进行打包。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.0.4</version>
</plugin>
可以通过IDEA快速打包,或者通过命令mvn clean package
进行打包
构建成功之后,我们进入target目录下:cd target
然后使用跟踪代理运行应用程序:
执行此命令前注意你的idea配置的JDK也需要是GraalVM JDK
java -agentlib:native-image-agent=config-output-dir=META-INF/native-image -jar ./app.jar
执行时,会真实的启动你的项目并且执行,所以最好正常流程和异常流程都要测试到。
执行完成之后,会在target目录下生成一个META-INF
的文件夹,这个文件夹中包含的内容就是使用跟踪代理生成的反射配置。
把这个文件夹的内容复制到项目resources
目录下
然后回到pom.xml
文件,注释掉spring-boot-maven-plugin
添加native-image-maven-plugin
,如下:
<plugin>
<groupId>org.graalvm.nativeimage</groupId>
<artifactId>native-image-maven-plugin</artifactId>
<version>21.2.0</version>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
<configuration>
<skip>false</skip>
<imageName>graalvmMaven</imageName>
<mainClass>run.runnable.clipsortxml.ClipSortXmlApplication</mainClass>
<buildArgs>
--no-fallback
</buildArgs>
</configuration>
</plugin>