native-image打包原生镜像(spring-boot 3.x)

801 阅读3分钟

一、背景

有个需求,需要在企业内所有个人办公客户电脑上(windows)安装一个程序,该程序可以实现指定的功能,但有个前提,程序需要为可执行二进制文件,不能额外安装环境如Python、JDK等等...

考虑的实现方式:

  1. GOLANG开发
  2. JAVA开发,配置native-image打包原生镜像

本篇选择了后者

二、需要了解的知识

  1. visual studio是什么?

一套微软出品的提供给开发人员使用的大型IDE工具,主要针对windows系统上软件的开发。本篇中,java包之所以能编译成可执行exe二进制文件,主要归功于其强大的桌面软件编译的能力

  1. graalvm是什么?

oracle孕育出品的一款新时代的jvm,其一大特点就是支持原生镜像的编译

  1. native-image是什么?

native-image 是 GraalVM 提供的一个工具,它允许将 Java 应用程序编译成独立的本地可执行文件。这种编译方式称为 Ahead-of-Time (AOT) 编译,与 Java 虚拟机的 Just-in-Time (JIT) 编译相对。使用 native-image 生成的可执行文件可以在没有 JVM 的情况下运行,从而带来更快的启动时间和更低的内存占用。

以下为具体实施步骤:

三、环境

3.1、visual studio安装(参考文章如下)

www.graalvm.org/latest/docs…

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

image.png 查看工具是否已经被安装:

gu list

image.png

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相关环境配置

需要配置INCLUDELIBPATH等路径,具体路径根据自行安装的位置进行修改

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

image.png

四、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工具进行开发时,按照如下图顺序操作

image.png

image.png

成果

如果你的操作没有问题,那么您应该能正常执行exe文件并得到如下图效果。

速度超快,就是包有点大

image.png

打包命令

mvn native:compile-no-fork -f pom.xml

mvn -Dnative -DskipTests package -X

参考文章

blog.csdn.net/m0_46596655…

blog.csdn.net/halozhy/art…

www.toutiao.com/article/716…

luoma.pro/Content/Det…