序
使用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可执行文件