参考文章:

http://glemir.xplore.cn/archives/200

http://blog.csdn.net/nsrainbow/archive/2008/04/26/2333206.aspx

这里结合参考的文章和网上的一些JRE瘦身经验说下我精简JRE的过程。

精简过的JRE一般都不是通用的,都是针对自己的应用程序把不需要的类去掉,从而达到精简目的。所以有些人想拿别人精简过的JRE运行自己的应用程序,这样是不靠谱的。最后还是得自己动手精简,过程也挺简单。

思路:

把自己的应用程序打包成jar,然后通过jar命令运行这个jar,把jar所需的类全部打印到一个文本文件里面,把文本文件里面的类提取出来,重新打包。覆盖JRE目录中的JAR包。去掉JRE下bin目录和lib目录中不需要得。瘦身完成。

应用程序打包后是test.jar,jre(目录) 也和它同一文件夹,写一个CMD脚本方便测试:

@echo off
set path=./jre6/bin
java -jar -verbose:class test.jar >>class.txt
pause

这样程序使用的就是当前目录下的jre,程序运行后,最好把所有的功能使用一遍,这样输出了一个文件class.txt,里面有所有需要的class,其格式如下:

[Opened D:\data\dict\jre\lib\rt.jar]
[Loaded java.lang.Object from D:\data\dict\jre\lib\rt.jar]
[Loaded java.io.Serializable from D:\data\dict\jre\lib\rt.jar]
[Loaded java.lang.Comparable from D:\data\dict\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from D:\data\dict\jre\lib\rt.jar]
[Loaded org.apache.lucene.index.CompoundFileReader$FileEntry from file:/D:/data/dict/dict.jar]

输出的class文件里面可能还包含其他应用的jar包,如:charsets.jar。这样就需要把class文件里面的信息按rt和charsets分成两类分别放到两个txt文件里面:rt_class.txt,charsets.txt

我们依照这个文件来裁剪rt.jar:
首先在utralEdit中进行一些处理,去掉所有不是rt.jar中的class的行,去掉from后面的,去掉loaded等无关项目,再把“.”替换成“/”.这个可以利用正则表达式等轻松处理。处理完后得到的文件类似如下格式:

rt_class.txt

java/lang/Object
java/io/Serializable
java/lang/Comparable
java/lang/CharSequence
java/lang/String 

我们依照这个文件来裁剪charsets.jar:
首先在utralEdit中进行一些处理,去掉所有不是charsets.jar中的class的行,去掉from后面的,去掉loaded等无关项目,再把“.”替换成“/”.这个可以利用正则表达式等轻松处理。处理完后得到的文件类似如下格式:

charsets.txt

sun/nio/cs/ext/ExtendedCharsets
sun/nio/cs/ext/GBK
sun/nio/cs/ext/DoubleByteDecoder
sun/nio/cs/ext/GBK$Decoder
sun/nio/cs/ext/DoubleByteEncoder
sun/nio/cs/ext/GBK$Encoder 

然后写一个脚本或者程序处理,从rt或charsets中把需要的的class拷贝到另一个对应的文件夹rt1或charsets1,这里参考网上的一个JAVA抽取程序。

在运行下面JAVA程序之前需要将JRE目录中rt.jar,charsets.jar分别解压到相应目录

代码如下:

package com.ccic.greenjvm;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;public class ReduceRt {// 文件拷贝public static boolean copy(String file1, String file2) {try // must try and catch,otherwide will compile error{// instance the File as file_in and file_outjava.io.File file_in = new java.io.File(file1);java.io.File file_out = new java.io.File(file2);FileInputStream in1 = new FileInputStream(file_in);FileOutputStream out1 = new FileOutputStream(file_out);byte[] bytes = new byte[1024];int c;while ((c = in1.read(bytes)) != -1)out1.write(bytes, 0, c);in1.close();out1.close();return (true); // if success then return true} catch (Exception e) {System.out.println("Error!");return (false); // if fail then return false}}// 读取路径,copypublic static int dealClass(String needfile, String sdir, String odir) throws IOException {int sn = 0; // 成功个数File usedclass = new File(needfile);if (usedclass.canRead()) {String line = null;LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(usedclass),"UTF-8"));while ((line = reader.readLine()) != null) {line = line.trim();int dirpos = line.lastIndexOf("/");if (dirpos > 0) {String dir = odir + line.substring(0, dirpos);File fdir = new File(dir);if (!fdir.exists())fdir.mkdirs();String sf = sdir + line + ".class";String of = odir + line + ".class";boolean copy_ok = copy(sf.trim(), of.trim());if (copy_ok)sn++;else {System.out.println(line);}}}}return sn;}public static void main(String[] args) {String needfile = "D:/greanjvm/rt_class.txt";//运行JAR生成的,应用程序所需类的txt文件String sdir = "D:/greanjvm/rt/"; //rt.jar解压后的目录String odir = "D:/greanjvm/rt1/";//抽取的类存放目录try {int sn = dealClass(needfile, sdir, odir);System.out.print(sn);} catch (IOException e) {e.printStackTrace();}}
}

所需的类都抽取到rt1目录之后,把原rt目录中的“META-INF”文件夹拷贝到rt1下面,进入rt1目录,用rar压缩工具打包成rt.zip,改名为rt.jar,然后替换jre6/lib目录下的rt.jar。

charsets1目录处理同上。

所需类的精简工作已经完成,接下来精简其他的。

1、Jre目录下的license都删除,只留bin和lib目录

2、bin下的执行文件需要运行jar时用DLL_Killer工具查看使用到了哪些文件

3、lib下只要保留 rt,charsets库就可以了(因为应用程序只用到了这两个)。

4、除了i386和zi两个子目录外,其余的子目录都可以不要(原则上都要自己试试看删除其他目录会不会报错)。

5、Zi下只需要保留自己地区的子目录和其下的一些文件就可以(这里Zi下我只保留了America文件夹)。

6、Lib下除了库之外的属性文件都要保留。

优化完成!!!!!!!!!!!

注意事项:

1、精简BIN目录
  *运行JAR包时需指定PATH路径,不然会默认搜索环境变量中的JDK路径。
  *用DLL_Killer工具查看任务管理器中java.exe调用的DLL库

2、精简LIB目录
  *抽取出的类重新打包成rt.jar时要注意,用JAR命令和rar工具打的jar包都不行。解决如下:
 -将原生的rt.jar用rar打开,然后进入相关目录,删除掉相关目录或者文件,再把抽取出来的类拖进来就行了。
  *zi文件夹下只留America文件夹

BIN目录

lib目录

JVM目录

哥的整个测试目录

精简后JRE接近7M

精简jre(JDK6瘦身)相关推荐

  1. JDK14+JAVAFX14+Maven定制jre打包瘦身,必成版

    注: 本教程jdk9以上版本通用(任何java项目都可以通过本教程精简jre) 博客来由: jdk9以后代码模块化逐渐成为趋势,jlink工具开始出现在人们的视野中,它可以用来定制项目所需要的jre, ...

  2. java jre 减少尺寸_整理JRE瘦身或精简JRE

    前不久给朋友做了一个桌面程序,程序文件没多大,但运行java程序需要jre,但jre足足有80M多,然后在网上搜了如何给给JRE瘦身或精简JRE,整理如下: 打开JRE安装目录.目录包括bin,lib ...

  3. JRE8 打包瘦身(180M的JRE瘦身成11M,OMG)

    最近接到一个考试软件的试用版,需要让用户下载到本地,解压后直接运行的.对于C#来说这都不是事,可以JAVA就惨了,JRE本身就180多M,让用户下载这么大个包,一定会被吐槽.于是要瘦身. 首先去这里下 ...

  4. 精简TTF字体、汉字字体瘦身 FontPruner,并转化为Base64编码

    网上比应用比较多的 字蛛 http://font-spider.org/ 本文使用了本机安装软件,得到瘦身后的 TTF 字体文件 一.使用FontPruner为字体瘦身 准备工具: python : ...

  5. 同学,运维喊你来精简日志啦 - 日志瘦身方法论

    作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,<性能优化方法论>作者.<解锁大厂思维:剖析<阿里巴巴Java开发手册>>.<再学经 ...

  6. spring boot项目精简瘦身打包

    1.背景介绍 当网络不是很给力的时候,一个大的jar包传输是费时的,往往存在修改1分钟,传包10分钟的尴尬时刻. 1)正常打包出来的jar 2)解压出来后的包大小98M 3)lib的jar包大小 综上 ...

  7. 精简瘦身Windows XP的方法

    Windows XP系统中包含许多对于普通用户用不上的功能,我们完全可以对XP来一次瘦身. 1.在各种软硬件安装妥当之后,其实XP需要更新文件的时候就很少了.删除系统备份文件吧:开始→运行→sfc.e ...

  8. python 打包 太大 精简_pyinstaller打包结果瘦身

    如果想把python程序发布成.exe的话,一般我们都会使用pyinstaller, 怎么打包这里我就不说了.有时我们打包的结果会非常大,我最大的一次居然有900M......下面我就总结一下可以对发 ...

  9. Docker镜像瘦身

    Docker 是一个用于开发,交付和运行应用程序的开发平台. 它能够将应用程序和基础架构分开,保证开发,测试, 部署的环境完全一致,从而达到快速交付的目的. 但是在实际项目中,会对项目中的模块或者服务 ...

最新文章

  1. python查找字符串出现次数_Python 中找出字符串中出现频率最高的字母
  2. JavaScript初学者编程题(9)
  3. cache老化时间的思考--以nat为例
  4. python语言创意绘画-齐齐哈尔富裕高校邦数据科学通识课【Python基础语法】答案...
  5. 超简单炫彩抽象线条感海报PSD分层素材,一切变得简单!
  6. Windows 定时执行脚本
  7. CENTOS 7.0 安装discuz ,搭 mysql +php+apache 环境
  8. poj 1466 Girls and Boys
  9. 应用安全 - 工具使用 - Nmap
  10. Win10安装Eclipse以及可能出现的问题
  11. js 原生 导出 excel
  12. 计算机组成原理第三章课后答案,《计算机组成原理》第三章课后题参考答案
  13. 计算机软件高级证书试题,高级程序员认证考试经验总结
  14. python里面的pip是什么意思_python的pip有什么用
  15. Roaring64Bitmap实践
  16. Java 服务接入 OpenTracing(1)--从 Tracing 到 OpenTracing
  17. x265线程池机制和并行编码机制分析
  18. 【LeetCode Python实现】 5473. 灯泡开关 IV(中等)
  19. celery英语_蔬菜介绍:芹菜 Celery
  20. 2018中国大学生程序设计竞赛 - 网络选拔赛

热门文章

  1. 【Axure高保真原型】中继器版下拉列表
  2. 分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)
  3. 如何查看某个网站的ip地址(根据域名怎么知道IP)
  4. LinuxC实现文件夹及其文件的拷贝
  5. Linux C 应用编程学习笔记——(1)应用编程概念
  6. 要怎么礼貌又得体地拒绝掉收到的offer?
  7. 计算机学习书籍分享—PDF版,供大家学习使用
  8. 帆软报表与润乾报表的破解策略
  9. 我的世界服务器修改logo,《我的世界手机版》如何修改界面logo斜体小黄字
  10. 互联网业务数据分析- 数据处理