一次对JDK进行"减肥"的记录

起因
最近做的一个小项目,因为要涉及到批量部署,每次在部署之前都需要在各个主机上先安装jdk环境(为了使用jdk自带的工具如jps等,所以没有单纯安装jre),但是因为jdk文件太大(以jdk-8u161-linux-x64.tar.gz文件为例,大小为:189.8 MB),每次花费在文件拷贝上的时间都比较多,特别是需要大批量部署的时候总共需要消耗的时间还是比较可观的.因此就突发奇想:是否可以对jdk进行"廋身"呢?毕竟并非JDK中所有的Java类都需要用到,可以将那些不需要的Java类文件以及一些文档性的东西删除掉.于是在google了一下,已经有人这么干过了,参考: https://blog.csdn.net/xuweilinjijis/article/details/77527117 jdk1.8运行环境精简瘦身
我的实践
我根据搜索到的资料,结合自身的实际需求,以满足程序能够正常运行的最低需求,对jdk-8u161-linux-x64.tar.gz进行了相应的精简,最后成功将jdk安装包从"189.8 MB"精简到"49.6 MB".

如下是对JDK进行精简实践的具体步骤:
删除运行程序并不需要的文档文件及目录
jdk1.8.0_161/javafx-src.zip
jdk1.8.0_161/src.zip
jdk1.8.0_161/man
jdk1.8.0_161/db
上述文件为文档性文件,在运行程序时并不需要,可以直接删除掉.
删除运行程序并不需要的jar包,文件及目录
jdk1.8.0_161/lib/missioncontrol
jdk1.8.0_161/lib/visualvm
jdk1.8.0_161/lib/ant-javafx.jar
jdk1.8.0_161/lib/javafx-mx.jar
jdk1.8.0_161/lib/jconsole.jar
jdk1.8.0_161/jre/lib/amd64/libawt_xawt.so
jdk1.8.0_161/jre/lib/amd64/libjavafx_font_freetype.so
jdk1.8.0_161/jre/lib/amd64/libjavafx_font_pango.so
jdk1.8.0_161/jre/lib/amd64/libjavafx_font.so
jdk1.8.0_161/jre/lib/amd64/libjavafx_font_t2k.so
jdk1.8.0_161/jre/lib/amd64/libjavafx_iio.so
jdk1.8.0_161/jre/lib/amd64/libjfxwebkit.so
jdk1.8.0_161/jre/lib/desktop
jdk1.8.0_161/jre/lib/ext/jfxrt.jar
jdk1.8.0_161/jre/lib/fonts
jdk1.8.0_161/jre/lib/locale/de
jdk1.8.0_161/jre/lib/locale/fr
jdk1.8.0_161/jre/lib/locale/it
jdk1.8.0_161/jre/lib/locale/ja
jdk1.8.0_161/jre/lib/locale/ko
jdk1.8.0_161/jre/lib/locale/ko.UTF-8
jdk1.8.0_161/jre/lib/locale/pt_BR
jdk1.8.0_161/jre/lib/locale/sv
jdk1.8.0_161/jre/lib/locale/zh_HK.BIG5HK
jdk1.8.0_161/jre/lib/locale/zh_TW
jdk1.8.0_161/jre/lib/locale/zh_TW.BIG5
jdk1.8.0_161/jre/lib/oblique-fonts
jdk1.8.0_161/jre/lib/deploy.jar
jdk1.8.0_161/jre/lib/locale/
删除jar包中不需要的Java类包
jdk1.8.0_161/jre/lib/charsets.jar/sun/awt
jdk1.8.0_161/jre/lib/resources.jar/javax/swing
jdk1.8.0_161/jre/lib/rt.jar/com/sun/awt
jdk1.8.0_161/jre/lib/rt.jar/com/sun/java/swing
jdk1.8.0_161/jre/lib/rt.jar/com/sun/swing
jdk1.8.0_161/jre/lib/rt.jar/java/applet
jdk1.8.0_161/jre/lib/rt.jar/java/awt
jdk1.8.0_161/jre/lib/rt.jar/javax/swing
jdk1.8.0_161/jre/lib/rt.jar/sun/applet
jdk1.8.0_161/jre/lib/rt.jar/sun/awt
jdk1.8.0_161/jre/lib/rt.jar/sun/java2d
jdk1.8.0_161/jre/lib/rt.jar/sun/swing
总结
这个JDK精简的实现并不涉及任何技术难点,也并非必要.在我自己的实际场景中是因为触及到需要大量拷贝JDK文件导致消耗时间太长这个痛点了,所以才考虑这么做.另外,虽然我需要对程序进行批量部署,但是由于程序很简单,并未使用比较复杂的自动化部署工具,如:Ansible,Puppet等等,而是仅仅通过一个shell脚本进行自动化拷贝和部署.所以,当我在自己实现这个自动化部署工具的时候才真正感受到大文件拷贝消耗的时间成本.
一次对JDK进行"减肥"的记录的更多相关文章
- Windows环境下JDK的配置及多版本JDK切换的方法记录
(这里记录了笔者了解的关于JDK环境配置的信息,以及针对系统上存在不同版本JDK时所尝试的解决方案.具体来说,是已安装 JDK 8 后,又安装了 JDK 9 时所遇到的问题和尝试的解决方法.这次记录以 ...
- java jdk动态代理学习记录
转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...
- ubuntu 下面手动安装jdk
ubuntu 下面手动安装jdk 刚才在ubuntu安装jdk和eclipse,感觉主要安装jdk比较麻烦,记录一下笔记以备后面查看 先在官网上下载jdk的tar包:http://www.oracle ...
- JDK配置环境变量不成功的原因
根据自己配置环境变量遇到的问题进行总结: 1.二次安装需要注意的问题 由于已经安装了一次的原因,此时的注册表已经有了安装记录. 建议删除jdk的记录 首先打开注册表 开始菜单→运行.或者直接键盘按下W ...
- mac下查看jdk安装版本及安装目录
使用IntelliJ idea新建工程时需要查看jdk安装目录,记录下来为以后备用. mac自带jdk,查看jdk版本: IcarusdeMacBook-Pro:~ icarus$ java -ver ...
- Ubuntu 14.10 配置JDK + J2EE
本文仅作为本人在Ubuntu 14.10下安装JDK + J2EE的一个记录: 安装JDK 从Oracle的官网下载jdk-7u75-linux-x64.tar.gz 将jdk-7u75-linux- ...
- 《如何在大学里脱颖而出(How to Win at College)》读书笔记
<如何在大学里脱颖而出(How to Win at College)>读书笔记 图书简介 中文版: 英文版: 作者卡尔·纽波特(Cal Newport)于 2004 年6月以优等生荣誉学会 ...
- 搭建Struts2不同版本jar包不同
struts2的版本比较多,所以在开发的时候特别要注意版本不同所需引入的包是不一样的.否则,会出现各种问题.而且很难找到问题所在. 以下是我遇到的问题总结: 一.当我运用struts2.3.4.1时, ...
- Java 日志管理最佳实践
转:http://blog.jobbole.com/51155/ 日志记录是应用程序运行中必不可少的一部分.具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源.对于开 ...
随机推荐
- 好代码是管出来的——.Net Core集成测试与数据驱动测试
软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...
- 关于ORACLE数据库名以及数据实例名等几个重要概念
在Oracle中有关数据库和数据库实例的几个重要概念,有时候如果理解不是很深或者对其疏忽.混淆了,还真容易搞错或弄不清其概念,下面就数据库实例名.数据库名.数据库域名.数据库服务名.全局数据库名几个概 ...
- C# 直接引用js文件,调js里的数据
C# 直接引用js文件,调js里的数据 引入命名空间 using System.IO; string path = AppDomain.CurrentDomain.BaseDirectory + &q ...
- 【内容】MVP 三剑客活动
最近微软搞了一个活动,叫做三剑客,主旨就是“Cloud+AI本地化社区活动,为微软产品本地化做出自己的贡献”,虽然已是rMVP,但也同样收到的社区经理的来信,本人也报名参加了这个活动,同时给了我三个小 ...
- Webstorm 2018 激活破解
本文最后更新于 2018-5-4 可能会因为没有更新而失效.如已失效或需要修正,请留言! 问题 激活 webstorm 2018 最新版 解决步骤 License server:http://hb5. ...
- mybatis insertUseGeneratedKeys 返回主键为null
package tk.mybatis.mapper.common.special; import org.apache.ibatis.annotations.InsertProvider; impor ...
- 我们为什么要使用RabbitMQ?
一.前言 这篇文章就是讲RabbitMQ的好处,你可能要说RocketMQ很好呀,我们主要看上的就是RabbitMQ支持多语言的客户端,很符合我们公司的现状,不要我们花费功夫去搞一个客 ...
- nextInt()和nextLine()一起使用时的注意点
问题原因:nextLine()会把nextInt(),next(),nextDouble(),nextFloat()的结束换行符作为字符串读入,进而不需要从键盘输入字符串nextLine便已经转向了下 ...
- PyCharm选中文件夹新建时Directory与Python package的区别
pycharm创建普通的directory和package时都是在硬盘上建立一个文件夹.但是建package时会在这个文件夹中自动地生成一个空的__init__.py文件.python的一个包是一个带 ...
- Asp.Net Core Options模式的知识总结
Options模式是Asp.Net Core中用于配置的一种模式,它利用了系统的依赖注入,并且还可以利用配置系统.它使我们可以采用依赖注入的方法直接使用绑定的一个POCO对象,这个POCO对象就叫做O ...