windows下使用graalvm/spring native将JAVA程序构建为本地可执行的exe程序

使用graalvm aot编译器将java程序编译为本地机器码,大幅提升性能。随手建一个空springboot项目玩一下启动速度提升肉眼可见,内存占用也大幅下降

执行JAR包
在这里插入图片描述
执行AOT编译的exe
在这里插入图片描述

环境准备

虚拟机

GraalVM官网
社区版官方下载地址
本文使用graalvm-ce-java17-windows-amd64-22.0.0.2
VM下载后解压,与JVM一样,将bin目录配置到环境变量path中

VS构建工具

MSVC生成工具官方下载地址
执行安装选择如图项目
在这里插入图片描述
完整安装后配置环境变量

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;D:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\include.;
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;D:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\lib\x64;
PATH=%PATH%;D:\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64

安装AOT编译器

执行命令

gu install native-image

注:gu.exe在graalvm bin目录下,如果无法执行检查虚拟机环境变量是否正确
执行命令检查

gu list
在这里插入图片描述

构建JAVA程序

项目maven bom修改如下
pom.xml

<dependencies>
	...
	<!-- 增加graal依赖 -->
    <dependency>
        <groupId>org.graalvm.sdk</groupId>
        <artifactId>graal-sdk</artifactId>
        <version>22.0.0.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
<build>
	<plugins>
		  <!-- 增加AOT编译插件 -->
          <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>org.psr.sample.Application</mainClass>
                 <buildArgs>
                     --no-fallback
                 </buildArgs>
             </configuration>
         </plugin>
	</plugins>
</build>

执行 mvn package即可打包生成exe可执行文件

使用spring native构建spring应用

直接使用graal AOT构建spring应用是不行的,因为很多通过反射等动态加载机制调用的类无法追踪,导致ClassNotFound错误无法构建,自行维护ReflectionConfigurationFiles 反射配置文件过于繁琐。
可使用spring native项目完成构建

spring项目maven bom修改如下
pom.xml

<dependencies>
	...
	<!-- 增加spring-native依赖 -->
    <dependency>
        <groupId>org.springframework.experimental</groupId>
        <artifactId>spring-native</artifactId>
        <version>0.11.3</version>
    </dependency>
</dependencies>
<build>
	<plugins>
		  <!-- 增加spring AOT插件 -->
          <plugin>
              <groupId>org.springframework.experimental</groupId>
              <artifactId>spring-aot-maven-plugin</artifactId>
              <version>0.11.4</version>
              <executions>
                  <execution>
                      <id>generate</id>
                      <goals>
                          <goal>generate</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
          <plugin>
              <groupId>org.graalvm.buildtools</groupId>
              <artifactId>native-maven-plugin</artifactId>
              <version>0.9.11</version>
              <extensions>true</extensions>
              <executions>
                  <execution>
                      <id>build-native</id>
                      <goals>
                          <goal>build</goal>
                      </goals>
                      <phase>package</phase>
                  </execution>
              </executions>
              <configuration>
              </configuration>
          </plugin>
          <!-- Avoid a clash between Spring Boot repackaging and native-maven-plugin -->
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
              <configuration>
                  <classifier>exec</classifier>
              </configuration>
          </plugin>
	</plugins>
</build>
<!-- 由于spring-native处于实验阶段,添加spring仓库获取依赖和插件 -->
<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>

执行 mvn package即可打包生成exe可执行文件

posted on 2022-04-11 22:37  路过君  阅读(1116)  评论(0编辑  收藏  举报

导航