1 背景
Graalvm是Oracle推出的一款新型虛擬機器,其中一個吸引人的功能是:它可以將Java程式碼編譯成各個平臺的原生程式碼,這些平臺包括:linux、macOS、windows、iOS、android。
這個功能可以極大地加快Java程式的啟動速度,它對於docker+微服務(雲原生)應用,以及客戶端應用非常有用。
2019年的時候我就有跟進過這個功能,並嘗試在windows上編譯Javafx,不過失敗了。在查詢了stackoverflow和github之後,發現它當時僅支援linux上編譯Javafx,對wiindows的支援要到後續的版本。
最近我又看到新的進展,發現Graavlm社群版從20.0.2(2020年8月)開始支援javaFx在windows本地編譯。
現在讓我們再來嘗試一下吧。
2 編譯環境
- Intel i7-4720HQ 16G
- Windows 10 64-bit
- VS2019社群
- Graalvm社群版 20.0.2
- JDK 11
3 步驟
3.1 安裝graalvm
Graalvm有2種版本,一是oracle維護的企業版,二是github社群維護的社群版。我們選擇社群版來測試。
首先到github上下載Graalvm社群版,可以看到有很多下載項:
我們選擇graalvm-ce-java11-windows-amd64-20.2.0.zip。下載完畢後,將它內容解壓至:
C:\java\graalvm-ce-java11-20.2.0
然後設定windows環境變數:
GRAALVM_HOME=C:\java\graalvm-ce-java11-20.2.0
JAVA_HOME=C:\java\graalvm-ce-java11-20.2.0
3.2 安裝GRaalvm Native-image工具
由於Native-Image工具與Graalvm是分開發行的,所以我們還要下載Native-Imag工具。下載地址為:
https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/native-image-installable-svm-java11-windows-amd64-20.2.0.jar
下載完畢後,執行:
gu -L install native-image-installable-svm-java11-windows-amd64-20.2.0.jar
注意事項:
- 必須安裝這個工具,否則編譯時會報錯。
- 工具的版本要跟Graalvm的版本匹配,否則會報錯,類似於:
3.3 安裝vs2019社群版
下載地址
https://visualstudio.microsoft.com/zh-hans/vs/
安裝的注意事項
- 工作負載請選擇:使用C ++桌面開發;
- 語言包請選擇:英語。
- 路徑請使用預設的。
- 詳細的安裝過程就不贅述了,請參考教程:《安裝VS2019(C/C++)詳細教程》
測試
開啟命令列,執行:
# 初始化x64的編譯環境。
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\ Build\vcvars64.bat”
如果出現以下的輸出,就說明編譯環境是正常的:
3.4 示例程式碼
下載
git clone https://github.com/gluonhq/client-samples.git
說明:
- 本示例由Gluon公司提供的,Gluon公司是OpenJFX專案和Graalvm專案的貢獻者。
- 示例中使用一個名為client-maven-plugin的外掛,它封裝了native-image的相關命令,簡化了打包操作。
- client-maven-plugin外掛文件:https://docs.gluonhq.com/#_the_gluon_client_plugin_for_maven
3.5 編譯
執行命令
# 進入示例目錄 cd gluon-samples-master
# 進入HelloFx示例目錄 cd HelloFX
# 初始化x64編譯環境 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
# 編譯。它相當於client:compile + client:link mvn clean client:build
輸出:
編譯的時間有點長,請耐心等待。本機編譯耗時230秒。
注意事項
- 必須保證有足夠的剩餘記憶體,最好在5GB以上,否則有可能會報記憶體不足的錯誤。
- 暫時關閉安全軟體。安全軟體會拖慢編譯速度,生成的exe檔案可能被誤刪。
4 效果
進入 HelloFx/target/client/x86_64-windows目錄,可以看到一個名為HelloFx.exe的檔案。如下圖所示:
4.1 啟動速度
雙擊HelloFx.exe執行,可以發現啟動速度非常快,達到了秒開的程度。如下圖所示:
4.2 程式大小
可以看到,程式大小約為58MB。
用7zip壓縮後,僅為13MB,分發給使用者非常方便。
如果在連結時排除掉一些不用的內容,體積可以進一步減小。
5 侷限和展望
目前它僅支援windows 64-bit的編譯,32-bit暫時不支援。不過隨著版本的演進,未來可能會支援。
如果近期就想要32-bit的,可以嘗試下載Graalvm的原始碼,自己編譯一個32-bit的版本。