一次对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/ 日志记录是应用程序运行中必不可少的一部分.具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源.对于开 ...
随机推荐
- 转:Git Submodule管理项目子模块
使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...
- Powershell-获取MAC地址对应IP信息
因业务需要在DHCP服务器上绑定设备MAC,提示"指定的IP地址或硬件地址正被其他客户端使用",与业务同事沟通之前该设备做过地址保留,具体对应地址遗忘了. 问题描述: a.按照用户 ...
- tensorflow的基本认识
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/10741013.html 作者:窗户 ...
- servlet中 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver异常
解决方法:将mysql-connector-java-xxx-bin.jar包,复制到项目下WebContent/WEB-INF/lib目录下,刷新重启tomcat运行即可.
- 【转】C# 定时器事件(设置时间间隔,间歇性执行某一函数,控制台程序)
using System.Timers;定时器事件代码 static void Main(string[] args) { Method(); #region 定时器事件 Timer aTimer = ...
- 多种解法解决n皇后问题
多种解法解决n皇后问题 0x1 目的 深入掌握栈应用的算法和设计 0x2 内容 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后,要求每 ...
- cordova插件汇总
1.获取当前应用的版本号 cordova plugin add cordova-plugin-app-version 2.获取网络连接信息 cordova plugin add cordova-plu ...
- Git基本原理-hash算法
一.哈希 哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点: ①不管输入数据的数据量有多大,使用同一个哈希算法,得到的加密结果长度固定 ②哈希算法确定,输入数 ...
- 2019-04-04 Mybatis学习知识点
1. 比较#和$的区别 #是占位符?,$是字符串拼接.因此使用$的时候,如果参数是字符串类型,那么要使用引号 尽量使用#而不是$ 当参数表示表名或列名的时候,只能使用$ 2. 多参数时候 配置文件中使 ...
- Spring 框架中注释驱动的事件监听器详解
事件交互已经成为很多应用程序不可或缺的一部分,Spring框架提供了一个完整的基础设施来处理瞬时事件.下面我们来看看Spring 4.2框架中基于注释驱动的事件监听器. 1.早期的方式 在早期,组件要 ...