起因

最近做的一个小项目,因为要涉及到批量部署,每次在部署之前都需要在各个主机上先安装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进行"减肥"的记录的更多相关文章

  1. Windows环境下JDK的配置及多版本JDK切换的方法记录

    (这里记录了笔者了解的关于JDK环境配置的信息,以及针对系统上存在不同版本JDK时所尝试的解决方案.具体来说,是已安装 JDK 8 后,又安装了 JDK 9 时所遇到的问题和尝试的解决方法.这次记录以 ...

  2. java jdk动态代理学习记录

    转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...

  3. ubuntu 下面手动安装jdk

    ubuntu 下面手动安装jdk 刚才在ubuntu安装jdk和eclipse,感觉主要安装jdk比较麻烦,记录一下笔记以备后面查看 先在官网上下载jdk的tar包:http://www.oracle ...

  4. JDK配置环境变量不成功的原因

    根据自己配置环境变量遇到的问题进行总结: 1.二次安装需要注意的问题 由于已经安装了一次的原因,此时的注册表已经有了安装记录. 建议删除jdk的记录 首先打开注册表 开始菜单→运行.或者直接键盘按下W ...

  5. mac下查看jdk安装版本及安装目录

    使用IntelliJ idea新建工程时需要查看jdk安装目录,记录下来为以后备用. mac自带jdk,查看jdk版本: IcarusdeMacBook-Pro:~ icarus$ java -ver ...

  6. Ubuntu 14.10 配置JDK + J2EE

    本文仅作为本人在Ubuntu 14.10下安装JDK + J2EE的一个记录: 安装JDK 从Oracle的官网下载jdk-7u75-linux-x64.tar.gz 将jdk-7u75-linux- ...

  7. 《如何在大学里脱颖而出(How to Win at College)》读书笔记

    <如何在大学里脱颖而出(How to Win at College)>读书笔记 图书简介 中文版: 英文版: 作者卡尔·纽波特(Cal Newport)于 2004 年6月以优等生荣誉学会 ...

  8. 搭建Struts2不同版本jar包不同

    struts2的版本比较多,所以在开发的时候特别要注意版本不同所需引入的包是不一样的.否则,会出现各种问题.而且很难找到问题所在. 以下是我遇到的问题总结: 一.当我运用struts2.3.4.1时, ...

  9. Java 日志管理最佳实践

    转:http://blog.jobbole.com/51155/ 日志记录是应用程序运行中必不可少的一部分.具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源.对于开 ...

随机推荐

  1. asp.net webapi 的Request如何获取参数

    public class BaseApiController : ApiController { private HttpRequestBase _request; /// 全局Requests对象 ...

  2. Raneto中文搜索支持

    背景 因业务部门需要在线软件使用说明文档,但我们资源不足,故我想找一个开源的知识库,发现 Raneto不错,决定使用. 官方文档相当清晰,部署完成,发布一些文章,启动项目,交由业务同事测试使用,于是我 ...

  3. JDBC 初识

    JDBC是 "Java Database Connective" 的缩写,是使用Java去连接数据库进行数据操作的过程. 首先通过Eclipse 创建动态项目,Dynamic We ...

  4. jmeter学习记录--04--Beanshell

    一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanSh ...

  5. Windows apache-flume-1.6.0+Kafka+Es

    apache-flume-1.6.0 kafka_2.11-1.1.0 elasticsearch1.5.1 flume配置 a1.sources = kafkaSource a1.channels ...

  6. 有这iconfont.woff文件 为什么还报404

    解决方法1.打开服务器IIS管理器,找到MIME类型. 2.添加MIME类型 添加三条: 文件扩展名 MIME类型 .svg image/svg+xml.woff application/x-font ...

  7. IP地址、子网掩码、默认网关是什么意思?

    (一)  问题解析 001.   问:  IP地址,子网掩码,默认网关,DNS服务器,有什么区别呀?我知道没有IP地址就不能上网,我也知道没设DNS就不能上外网,可它们都有什么功能,有什么区别呢?还有 ...

  8. Cordova Upload Images using File Transfer Plugin and .Net core WebAPI

    In this article, I am going to explain ,"How to Upload Images to the server using Cordova File ...

  9. 关于String的一些基础小题目

    需求一:从键盘输入一串字符串,统计数字,字母,空格,其它字符的个数 import java.util.Scanner; public class Q1 { public static void mai ...

  10. (简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程

    就在我们使用Pc接通安卓手机的时候,如果手机没有开启usb开发者调试模式,Pc则无办法成功检测到我们的手机,在一些情况下,我们使用的一些功能较强的app好比之前我们使用的一个app引号精灵,老版本就需 ...