Windows下使用Graalvm將Springboot應用編譯成exe大大提高啟動和執行效率

Antake發表於2023-02-01

GraalVM安裝

GraalVM安裝

安裝

請前往GraalVM官網 下載 GraalVM Community 22.3,注意當前支援的Springboot的GraalVM版本必須是22.3
筆者這裡下載的Java版本為17,如下圖

安裝GraalVM的方法與安裝JAVA方法大致相同,GraalVM中包括了JDK(無需再次安裝JDK),同時還需要安裝native-image工具(後續下載)

配置環境變數



使用命令檢視是否安裝graal vm成功

java -version

native-image工具安裝

這裡下載的檔案(同GraalVM下載位置下方的release檔案)為native-image-installable-svm-java17-windows-amd64-22.3.0.jar如下圖所示

下載完成之後在檔案目錄執行以下命令進行安裝

- gu install xxxx.jar(同下載的工具映象,網路下載)
- gu install -L xxxx.jar(同下載的工具映象,本地檔案)


使用以下命令檢視是否安裝成功

gu list

native-image

Visual Studio安裝

編譯native image必須依賴VC++的編譯環境,這裡必須使用微軟官方的vc++編譯工具Visual Studio,筆者這裡使用的最新版本2022Visual Studi官網

To use Native Image on Windows, install Visual Studio and Microsoft Visual C++ (MSVC).
There are two installation options:
    * Install the Visual Studio Build Tools with the Windows 10 SDK
    * Install Visual Studio with the Windows 10 SDK

You can use Visual Studio 2017 version 15.9 or later.

The `native-image` builder will only work when it is run from the **x64 Native Tools Command Prompt**.
The command for initiating an x64 Native Tools command prompt varies according to whether you only have the Visual Studio Build Tools installed or if you have the full Visual Studio 2019 installed.

從上可知,Visual Studio 2017 version 15.9 or later均可
開啟Visual Studio Installer,勾選如下圖中三個元件

安裝完成後,需要配置VC++的編譯環境變數PATH,INCLUDE,LIB

LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\ucrt\x64;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.16.27023\lib\x64

INCLUDE=C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\shared;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.16.27023\include

PATH=D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64



Springboot應用初體驗

建立專案


執行專案

除錯執行,正常啟動

編譯執行

編譯


如果出錯選擇下面的,或者在編譯外掛中重新配置

如果編譯都不行,用外掛編譯之前現在console執行以下命令

./mvnw -DskipTests=true -Pnative clean package

編譯完成之後在target裡面檢視檔案

執行



執行對比

jar(JVM)本地exe(native image)檔案大小18M69M啟動耗時1.183s0.098s記憶體佔用106M46m
根據上述對比結果,儘管是一個最簡單的springboot程式,但在啟動耗時上native具有明顯的優勢,達到毫秒級,佔用記憶體少了一半多。
由於是一項新技術,其推廣和普及肯定必定需要一段時間(畢竟我們還在JDK1.8,哈哈),但在一些新的小型應用中,完全可以試試手,畢竟儘量native用不了,還有jvm可以兜底,我們並需要為此做額外的工作。
最近,希望java web能透過native的特性,真正的適配雲原生環境。

相關文章