GraalVM入門到精通

2022-09-12 11:06:32 字數 2770 閱讀 7505

介紹

graalvm是乙個類似於jvm的虛擬機器,但還可以編譯和執行多種語言,如c++, js, python。當然這裡我們介紹它最特別之處:可以把j**a應用直接轉換成最精簡的本地二進位制應用(exe, elf等),然後可以脫離jvm,直接在本地平台執行。此處重點介紹exe。

安裝安裝vs環境(這裡是vs2022),需要安裝的元件如下

新增環境變數d:\ok\graalvm\bin

開啟控制台,執行gu install native-image(需要科-學-s-w),這個包能提供建立本地映象的能力。(native-image 命令)

用法控制台應用

編寫乙個j**a檔案

我這裡路徑為 d:/ok/test-se/main.j**a,內容如下:

import j**a.util.*;

public class main

}編譯這個j**a檔案(j**ac),得到main.class

開啟x64 native tools command prompt for vs 2022,如圖:

這個命令列整合了c++的編譯環境,用來生成目標exe檔案。

在這個命令列中cd到main.class的資料夾,輸入

native-image main

稍等片刻,即可看到生成了main.exe。

main.exe大小只有14.5mb,比jlink生成的還小。雙擊開啟效果如下,相當成功!

j**afx應用

這次我們難度加大點,來啟動乙個j**afx應用。

我們都知道,從jdk11開始j**afx就被移出了,使用時需要我們自己匯入對應的jar包。

生成單獨的jar包

pom.xml加入以下內容

org.apache.m**en.plugins

m**en-compiler-plugin

3.8.1

1717

org.apache.m**en.plugins

m**en-assembly-plugin

3.3.0

package

single

jar-with-dependencies

單獨啟動類的全類名

然後執行m**en package,執行完畢後把專案目錄的target/*-jar-with-denpendencies.jar(單jar檔案)複製出來,重新命名備用。(我這裡複製到d:/ok/test-fx/fx-demo.jar)

生成配置檔案

注:因為graalvm是在編譯時把所有用到的類都放在最後的二進位制檔案中,而它卻無法覺察到反射,jni等操作,所以需要我們編寫配置檔案告訴它,讓他把反射用到的class檔案,jni呼叫的dll檔案等也都加進來,這樣才能正確執行j**afx應用。

在vs控制台中,我們先cd到jar檔案的目錄,然後執行以下命令:

d:\ok\graalvm\bin\j**a -agentlib:native-image-agent=config-output-dir=./config -jar fx-demo.jar

這個命令會執行jar包,然後在執行時記錄它呼叫的資源到config資料夾的一些json檔案中。

執行成功以後,試用一下被開啟的j**afx應用(方便配置檔案的記錄,防止少記錄反射等資訊),然後關閉應用,就在資源管理器中就能看到在jar檔案的旁邊生成了乙個config資料夾,開啟以後出現這些檔案:

其中reflect-config.json記錄了反射的類,jni-config.json記錄了jni的方法,resource-config.json記錄了呼叫的dll資源,其他的還有動態**呼叫情況等等。

生成exe檔案

在剛剛的vs控制台執行以下命令:

native-image -h:configurationfiledirectories=./config -jar fx-demo.jar

該命令會根據jar檔案和剛剛生成的config資料夾中的配置檔案生成最終的exe可執行檔案。

結果竟然報錯了:

不過我們在jar檔案的目錄下看到生成了以下檔案:

其實這個錯誤應該是graalvm的乙個bug,不影響exe生成。

然後我們刪除目錄下多餘的檔案:awt.dll, j**a.dll, fx-demo.build_artifacts.txt。

開啟exe

生成的exe只有37.3mb!開啟fx-demo.exe,可以看到以下內容:

測試成功!!!

注:黑框暫時不知道怎麼去除。

總結graalvm可以把j**a應用程式直接轉換為本地應用,執行時不再依賴jvm,並且最終的成品還比jlink更小,是個相當不錯的工具。

Phoenix入門到精通

摘要 此phoenix系列文章將會從phoenix的語法和功能特性 相關工具 實踐經驗以及應用案例多方面從淺入深的闡述。希望對phoenix入門 在做架構設計和技術選型的同學能有一些幫助。phoenix是乙個開源的hbase sql層。它不僅可以使用標準的jdbc api替代hbase client...

GIT入門到精通

git工作流 版本回退 分支管理 標籤管理 遠端倉庫 linux torvalds在 1991 年建立了開源的 linux,從此,linux系統不斷發展,已經成為最大的伺服器系統軟體了。linux雖然建立了linux,但linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地為linux編寫...

Git 入門到精通

git是乙個開源的分布式版本控制系統,用以有效 高速的處理從很小到非常大的專案版本管理。git的特點 git 是用於 linux核心開發的版本控制工具。與常用的版本控制工具 cvs,subversion 等不同,它採用了分布式版本庫的方式,不必伺服器端軟體支援 wingeddevil注 這得分是用什...