Stories

Detail Return Return

Java模塊化應用實踐之精簡JRE | 京東雲技術團隊 - Stories Detail

導語

Java9及以後的版本引入了模塊化特性,但是直到今天JDK21都發布了,依然沒有被大量使用起來,那麼這個特性就真的沒啥意義了嗎?

別忘了,Java本身可是把模塊化做到了極致的,所以可以利用這個特性對JRE本身進行定製化或者精簡化。

由於平時偶爾會開發一些Java的客户端應用,這時精簡JRE的需求就凸顯出來,讓自己的程序帶着最精簡的JRE到處運行。

實際實踐了一段時間之後發現“真香!”

現在把“利用Java模塊化精簡JRE”的方法和經驗分享給大家。

案例項目

這是我的一個個人開源項目:MooInfo

項目地址:https://github.com/rememberber/MooInfo

項目結構如下:
image.png

一、找出項目依賴的模塊

1、maven編譯,打包項目,打包依賴jar到libs

image.png

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

執行結果:
image.png

可以看出把項目依賴的模塊打印了出來:
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

執行結果:
image.png

精簡JRE就製作完成啦!
image.png

三、精簡前後對比

精簡前

image.png
image.png

精簡後

image.png

image.png

由於本項目是桌面客户端項目,使用了佔用比較大的desktop模塊,如果是普通項目精簡之後還可以繼續縮小12MB
image.png

注:由於Java高版本JDK沒有完整的JRE目錄,上面精簡前的也是在JDK目錄的基礎上精簡之後的最小可用版本。

JDK1.8的JRE目錄佔用情況如下,供大家參考:
image.png

作者:京東科技 周波

來源:京東雲開發者社區 轉載請註明來源

user avatar openfuyao Avatar databend Avatar u_16769727 Avatar tully_l Avatar chengxy Avatar xuri Avatar shoushoudeqie Avatar wuxiedekeben Avatar renxingdebenma Avatar jiuliangxiaodeyaling Avatar aiyaotoudedianfengshan Avatar dexteryao Avatar
Favorites 17 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.