一、背景
有个需求,需要在企业内所有个人办公客户电脑上(windows)安装一个程序,该程序可以实现指定的功能,但有个前提,程序需要为可执行二进制文件,不能额外安装环境如Python、JDK等等...
考虑的实现方式:
- GOLANG开发
- JAVA开发,配置native-image打包原生镜像
本篇选择了后者
二、需要了解的知识
visual studio是什么?
一套微软出品的提供给开发人员使用的大型IDE工具,主要针对windows系统上软件的开发。本篇中,java包之所以能编译成可执行exe二进制文件,主要归功于其强大的桌面软件编译的能力
graalvm是什么?
oracle孕育出品的一款新时代的jvm,其一大特点就是支持原生镜像的编译
native-image是什么?
native-image 是 GraalVM 提供的一个工具,它允许将 Java 应用程序编译成独立的本地可执行文件。这种编译方式称为 Ahead-of-Time (AOT) 编译,与 Java 虚拟机的 Just-in-Time (JIT) 编译相对。使用 native-image 生成的可执行文件可以在没有 JVM 的情况下运行,从而带来更快的启动时间和更低的内存占用。
以下为具体实施步骤:
三、环境
3.1、visual studio安装(参考文章如下)
3.2、graalvm安装
graalvm有多种版本可以选择,github地址为:github.com/graalvm/gra…
建议直接下新版(自带native-image),这里我下载的是jdk17的版本 github.com/graalvm/gra…
除此之外,如果你已经安装了旧版的graalvm(不带native-image),需要自行安装native-image,在github上找到对应的jdk版本,下载native-image对应的jar包,执行如下命令进行安装:
gu install -L native-image-installable-svm-java11-windows-amd64-22.0.0.2.jar
查看工具是否已经被安装:
gu list
3.3、环境变量的配置
JAVA HOME
D:\develop\Java\graalvm-community-openjdk-17.0.9+9.1
GRAALVM HOME
D:\develop\Java\graalvm-community-openjdk-17.0.9+9.1
visual studio相关环境配置
需要配置INCLUDE、LIB、PATH等路径,具体路径根据自行安装的位置进行修改
INCLUDE
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.16.27023\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared
LIB
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.16.27023\lib\x64
MSVC
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.16.27023
PATH
%JAVA_HOME%\bin
%MSVC%\bin\Hostx64\x64
四、Spring(pom.xml)
如果使用了springboot搭建了spring环境(注意需要jdk11、springboot3.x等支持原生镜像的版本),需要在pom.xml中添加如下配置,即使用了spring-native插件
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-release</id>
<name>Spring release</name>
<url>https://repo.spring.io/release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-release</id>
<name>Spring release</name>
<url>https://repo.spring.io/release</url>
</pluginRepository>
</pluginRepositories>
五、执行命令
通过jetbrains等IDE工具进行开发时,按照如下图顺序操作
成果
如果你的操作没有问题,那么您应该能正常执行exe文件并得到如下图效果。
速度超快,就是包有点大
打包命令
mvn native:compile-no-fork -f pom.xml
mvn -Dnative -DskipTests package -X