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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM