导语

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

作者:京东科技 周波

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

Java模块化应用实践之精简JRE(内含开源)的更多相关文章

  1. Java 精简Jre jar打包成exe

    #开始 最近几天都在忙一个事情,那就是尝试精简jre,我想不明白为什么甲骨文官方不出exe打包工具... 网络上精简jre的文章很多,但是原创的似乎没几个,绝大多数都是转发同一个博客, 这里借鉴了不少 ...

  2. 精简JRE的思路初探

    引言: JRE是Java程序赖以执行的基础环境,眼下JRE已经很的庞大;即使为了执行一个简单的Hello World的程序.可能依旧须要依赖整个JRE,将近百兆大小的依赖性. 能否够对特定Java程序 ...

  3. 深入理解OSGI:Java模块化之路

    简介 Java可能是近20年来最成功的开发技术,因其具备通用性.高效性.平台移植性和安全性而成为不同硬件平台理想的开发工具.从笔记本电脑到数据中心,从游戏控制台到科学超级计算机,从手机到互联网,Jav ...

  4. Java模块化概念解惑与现状总结

    在过去几年,Java模块化一直是一个活跃的话题.从JSR 277(现已废止)到JSR 291,模块化看起来是Java进化过程中的必经一环.即便是基于JVM的未来语言,比如Scala,也考虑了模块化的问 ...

  5. 整理JRE瘦身或精简JRE

    http://blog.csdn.net/xiaoping8411/article/details/6973887 版权声明:本文为博主原创文章,未经博主允许不得转载. 前不久给朋友做了一个桌面程序, ...

  6. Java入门到实践系列(2)——Java环境搭建

    一.上集回顾 在<Java入门到实践系列(1)--Java简介>中提到过,Java程序是运行在Java虚拟机的,也展示过下面这张图. JDK:Java程序开发工具包. JRE:Java运行 ...

  7. Java模块化规范之争(转载)

    经过近20年的发展,Java语言已成为今日世界上最成功.使用的开发者人数最多的语言之一,Java世界中无数商业的或开源的组织.技术和产品共同构成了一个无比庞大的生态系统. 与大多数开发人员的普遍认知不 ...

  8. Java 理论与实践: 处理 InterruptedException

    捕捉到它,然后怎么处理它? 很多 Java™ 语言方法,例如 Thread.sleep() 和 Object.wait(),都可以抛出InterruptedException.您不能忽略这个异常,因为 ...

  9. paip.myeclipse7 java webservice 最佳实践o228

    paip.myeclipse7  java webservice 最佳实践o228 java的ws实现方案:jax-ws>>xfire ws的测试工具  webservice测试调用工具W ...

  10. Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)

    简介: Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能.非阻塞算法属于并发算法,它们可以安全地派生它们的线程, ...

随机推荐

  1. 【SpringBoot】整合Redis

    1.前言 最近公司在做项目,用到了redis,,发现自己一点都不会,然后就乘闲暇时间,自己学习一些redis相关的知识,在这里分享给像我一样的初学者. 2.我的项目结构: 2.1 pom.xml &l ...

  2. PWM点灯

    目录 PWM脉冲宽调点灯 前言 1.什么是PWM 2.PWM的实现 3.PWM实现步骤(通用定时器) 3.1 打开定时器的时钟 3.2 配置端口 3.3 设置定时器 3.4 设置PWM 3.5 完整代 ...

  3. 2023-07-23:给你 n 个任务和 m 个工人 每个任务需要一定的力量值才能完成 需要的力量值保存在下标从 0 开始的整数数组 tasks 中 第 i 个任务需要 tasks[i] 的力量才能完

    2023-07-23:给你 n 个任务和 m 个工人 每个任务需要一定的力量值才能完成 需要的力量值保存在下标从 0 开始的整数数组 tasks 中 第 i 个任务需要 tasks[i] 的力量才能完 ...

  4. Vortex Indicator 构建交易策略

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 今天的文章,我们将为大家介绍一个与DMI(Directional Movement Index)类似,判 ...

  5. 如何爆破js加密后的密码?

    如何爆破js加密后的密码? 1.首先burp中安装插件: https://github.com/whwlsfb/BurpCrypto 安装插件完毕后,分析进行js加密的算法. 2.分析加密过程: 找到 ...

  6. 深入浅出 Typescript

    TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准(ES6 教程). TypeScript 由微软开发的自由和开源的编程语言. TypeScript 设计 ...

  7. 4.4 C++ Boost 数据集序列化库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...

  8. 05 地址解析协议ARP

    地址解析协议(ARP) ARP(Address Resolution Protocol)地址解析协议: 根据已知的IP地址解析获得其对应的MAC地址 ARP工作流程 1.HOST1 ARP缓存 HOS ...

  9. 手写raft(三) 实现日志压缩

    手写raft(三) 实现日志压缩 在上一篇博客中MyRaft实现了日志复制功能,按照计划接下来需要实现日志压缩. 手写raft(一) 实现leader选举 手写raft(二) 实现日志复制 1. 什么 ...

  10. 如何通过API接口获取1688的商品详情

    1688是中国最大的B2B电商平台之一,吸引了大量的国内外买家和卖家,提供了丰富的商品资源.许多开发者和企业想要通过API接口获取1688商品的详细信息,以便于进行商品数据分析.价格监控等工作.在本文 ...