Java9及以後的版本引入了模塊化特性,實際實踐了一段時間之後發現“真香!”現在把“利用Java模塊化精簡JRE”的方法和經驗分享給大家。 ...
導語
Java9及以後的版本引入了模塊化特性,但是直到今天JDK21都發佈了,依然沒有被大量使用起來,那麼這個特性就真的沒啥意義了嗎?
別忘了,Java本身可是把模塊化做到了極致的,所以可以利用這個特性對JRE本身進行定製化或者精簡化。
由於平時偶爾會開發一些Java的客戶端應用,這時精簡JRE的需求就凸顯出來,讓自己的程式帶著最精簡的JRE到處運行。
實際實踐了一段時間之後發現“真香!”
現在把“利用Java模塊化精簡JRE”的方法和經驗分享給大家。
案例項目
這是我的一個個人開源項目:MooInfo
項目結構如下:
一、找出項目依賴的模塊
1、maven編譯,打包項目,打包依賴jar到libs
2、使用新版JDK自帶的jdeps找出依賴的模塊
上命令:
C:\Users\zhoubo9\.jdks\corretto-17.0.8.1\bin\jdeps -q --multi-release 17 --ignore-missing-deps --print-module-deps D:\IdeaProjects\MooInfo\target\MooInfo\libs\*.jar D:\IdeaProjects\MooInfo\target\MooInfo-1.1.3-runnable.jar
執行結果:
可以看出把項目依賴的模塊列印了出來:
java.base,java.desktop,java.instrument,java.management,java.naming,java.prefs,java.rmi,java.scripting,java.sql,jdk.compiler,jdk.httpserver,jdk.unsupported
二、使用新版JDK自帶的jlink製作自定義JRE
上命令:
C:\Users\zhoubo9\.jdks\corretto-17.0.8.1\bin\jlink --module-path C:\Users\zhoubo9\.jdks\corretto-17.0.8.1\jmods --add-modules java.base,java.desktop,java.instrument,java.management,java.naming,java.prefs,java.rmi,java.scripting,java.sql,jdk.compiler,jdk.httpserver,jdk.unsupported,jdk.crypto.ec --output D:\IdeaProjects\MooInfo\target\MooInfo\jre --no-header-files --no-man-pages --strip-debug --compress=2
執行結果:
精簡JRE就製作完成啦!
三、精簡前後對比
精簡前
精簡後
由於本項目是桌面客戶端項目,使用了占用比較大的desktop模塊,如果是普通項目精簡之後還可以繼續縮小12MB
註:由於Java高版本JDK沒有完整的JRE目錄,上面精簡前的也是在JDK目錄的基礎上精簡之後的最小可用版本。
JDK1.8的JRE目錄占用情況如下,供大家參考:
作者:京東科技 周波
來源:京東雲開發者社區 轉載請註明來源