Java模块化应用实践之精简JRE | 京东云技术团队

导语

Java9及以后的版本引入了模块化特性,但是直到今天JDK21都发布了,依然没有被大量使用起来,那么这个特性就真的没啥意义了吗?

别忘了,Java本身可是把模块化做到了极致的,所以可以利用这个特性对JRE本身进行定制化或者精简化。

由于平时偶尔会开发一些Java的客户端应用,这时精简JRE的需求就凸显出来,让自己的程序带着最精简的JRE到处运行。

实际实践了一段时间之后发现"真香!"
现在把"利用Java模块化精简JRE"的方法和经验分享给大家。

案例项目

这是我的一个个人开源项目:MooInfo

项目地址:github.com/rememberber...

项目结构如下:

一、找出项目依赖的模块

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目录占用情况如下,供大家参考:

作者:京东科技 周波

来源:京东云开发者社区 转载请注明来源

相关推荐
万亿少女的梦16811 分钟前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
庄周de蝴蝶29 分钟前
梅开二度,这次拿下系统分析师
后端·程序员
微信开发api-视频号协议33 分钟前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad
犀利豆1 小时前
#AI in Harness(一)
java·ai编程
极***涯1 小时前
深度拆解:多源BFS路径重构难题——跳出单层遍历误区,搞定高阶最短路径全量解
java·重构·宽度优先
Jackson__1 小时前
为了拯救我的腰椎和颈椎,我做了款浏览器插件!
前端·javascript·开源
林小帅2 小时前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端
YuK.W2 小时前
Leetcode100: 70.爬楼梯、118.杨辉三角、198.打家劫舍
java·算法·leetcode
IT_陈寒2 小时前
React的setState竟然不是立刻生效的,害我调试半天
前端·人工智能·后端
这不小天嘛2 小时前
JAVA八股——redis篇
java·开发语言·redis