Windows下使用Graalvm將Javafx應用編譯成exe

何德海發表於2021-01-10

1 背景

image

  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社群版,可以看到有很多下載項:

clip_image004

  我們選擇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的版本匹配,否則會報錯,類似於:

clip_image006

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”

 

如果出現以下的輸出,就說明編譯環境是正常的:

clip_image008

 

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

 

輸出:

clip_image010

  編譯的時間有點長,請耐心等待。本機編譯耗時230秒。

 

注意事項

  • 必須保證有足夠的剩餘記憶體,最好在5GB以上,否則有可能會報記憶體不足的錯誤。
  • 暫時關閉安全軟體。安全軟體會拖慢編譯速度,生成的exe檔案可能被誤刪。

 

4 效果

  進入 HelloFx/target/client/x86_64-windows目錄,可以看到一個名為HelloFx.exe的檔案。如下圖所示:

clip_image012

4.1 啟動速度

  雙擊HelloFx.exe執行,可以發現啟動速度非常快,達到了秒開的程度。如下圖所示:

clip_image013

4.2 程式大小

  可以看到,程式大小約為58MB。

  用7zip壓縮後,僅為13MB,分發給使用者非常方便。

  如果在連結時排除掉一些不用的內容,體積可以進一步減小。

 

5 侷限和展望

  目前它僅支援windows 64-bit的編譯,32-bit暫時不支援。不過隨著版本的演進,未來可能會支援。

  如果近期就想要32-bit的,可以嘗試下載Graalvm的原始碼,自己編譯一個32-bit的版本。

 

6 參考資料

相關文章