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