Java 模块化应用实践之精简 JRE | 京东云技术团队
导语
Java9 及以后的版本引入了模块化特性,但是直到今天 JDK21 都发布了,依然没有被大量使用起来,那么这个特性就真的没啥意义了吗?
别忘了,Java 本身可是把模块化做到了极致的,所以可以利用这个特性对 JRE 本身进行定制化或者精简化。
由于平时偶尔会开发一些 Java 的客户端应用,这时精简 JRE 的需求就凸显出来,让自己的程序带着最精简的 JRE 到处运行。
实际实践了一段时间之后发现“真香!”
现在把“利用 Java 模块化精简 JRE”的方法和经验分享给大家。
案例项目
这是我的一个个人开源项目:MooInfo
项目地址:https://github.com/rememberber/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 目录占用情况如下,供大家参考:
作者:京东科技 周波
来源:京东云开发者社区 转载请注明来源
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/164b273d4a0db5348cd0ce9ff】。文章转载请联系作者。
评论