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

打开JRE安装目录.目录包括bin,lib二个文件夹,所以就是将这两个文件进行瘦身了,

1. bin: 可以认为这是Java虚拟机.

2. lib: 执行class文件时,Java虚拟机需要用到的类库及资源文件.

一、bin瘦身主要从两方面考虑

① exe文件,最主要的工具是java.exe,它用来执行class文件,如果只是为了单纯运行Java程序的话,其他可执行文件一般都是用不到的(可剔除).

② DLL文件,是java.exe执行class文件过程中调用的,执行class文件,java.exe需要哪个库文件就加载哪个dll,不需用的可以剔除.

我们要做的就是找到哪些DLL文件是有用?我们运行一个Java文件看看,可以利用360安全卫士得到

1、准备java文件:

/* @author jarg @TODO 举例查看当前程序必需的dll文件 */ import java.io.InputStreamReader; import java.io.IOException; public class Hello { public static void main(String[] args) throws IOException { InputStreamReader ir = new InputStreamReader(System.in); System.out.println("Hello"); ir.read(); } } 2、编译、运行

3、360安全卫士 -> 功能大全 -> 进程管理器 右上角的显示加载到当前选中进程中的dll

4、这样我们留下java.exe、有用的dll文件和client目录就行

到这里bin的瘦身成功!

二、lib的瘦身

① lib目录最主要的类库是rt.jar,是任意Java程序所必需的类库.
lib目录大约62MB,但是rt.jar类库就占了47MB,可见精简bin目录,最主要是裁剪rt.jar.

② lib目录下一个运行Java程序不可或缺的文件是位于i386下的虚拟机配置文件jvm.cfg.该配置文件用来管理不同版本的jvm.dll.其内容作为java.exe,javac.exe的全局变量,用来加载相应的动态链接库文件.

③ lib目录里面除了包含程序运行所需要的类库及配置文件外,还包含有一些诸如: 鼠标光标,字体等系统资源.简单程序如果未用到这部分资源的话,可以剔除.如果程序除去JRE部分,占用空间较大的话,为了避除资源加载错误带来的麻烦,建议保留这不到20MB的配置文件内容.

主要步骤如下:

1、提取我们需要的类库(jar),借助-verbose命令,查看虚拟机在运行Java程序时所加载的所有类,如:

@echo off C:/Java/jdk1.6.0_16/bin/java -jar -classpath lib/*.jar; -verbose:class printSoft.jar >> class.txt pause在class.txt文件中保存如下的信息:

[Loaded java.lang.Math from shared objects file] [Loaded java.nio.charset.Charset$3 from C:\Java\jdk1.6.0_16\jre\lib\rt.jar] [Opened C:\Java\jdk1.6.0_16\jre\lib\charsets.jar] [Loaded sun.nio.cs.AbstractCharsetProvider from C:\Java\jdk1.6.0_16\jre\lib\rt.jar] [Loaded sun.nio.cs.ext.ExtendedCharsets from C:\Java\jdk1.6.0_16\jre\lib\charsets.jar] [Loaded java.lang.Class$1 from shared objects file] [Loaded sun.reflect.ReflectionFactory$1 from shared objects file] [Loaded sun.reflect.NativeConstructorAccessorImpl from shared objects file]我们可以从class.txt中得到我们需要的jar文件和class文件,提交jar很简单,我就不说了,下面我们在看看如何提交我们用到的class文件:

由于class.txt每行都是形同: [Loaded java.lang.System from shared objects file]的一串字符,修改文本以方便获取类完整名java.lang.System,从而获得类似类路径java/lang/System的一串字符,方便后继编写类拷贝程序.
修改方法:
1. 查找并替换[Loaded 为空,达到删除[Loaded 的目的.
2. 使用任意一个具有正则表达式查找替换功能的文本编辑器,查找并替换 from.*为空,达到删除 from及其后面的字符串的目的.
3. 查找并替换.为/
4. 删除以[Opened 开头的行.
5. 删除程序中System.out.println的输出行.
提取之后class.txt就剩下如下信息:

java/lang/Object java/io/Serializable java/lang/Comparable java/lang/CharSequence java/lang/String java/lang/reflect/GenericDeclaration .......

2、从现有的jar包中提取我们整理的class文件,然后打包成jar,最终取代原有的jar,下面是一个提取class的工具类:

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; public class CopyClass { private String source = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\"; // 类源目录 private String dest = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\"; // 类拷贝目的目录 String[] jarArr = new String[]{"rt","charsets"}; /*** * * @param source 类源目录 * @param dest 类拷贝目的目录 * @param jarArr 需要的提取的jar文件 */ public CopyClass(String source,String dest,String[] jarArr){ this.source=source; this.dest=dest; this.jarArr=jarArr; } public static void main(String[] args) { String[] jarArr = new String[]{"rt","charsets"}; CopyClass obj = new CopyClass("C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\", "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\",jarArr); obj.readAndCopy("C:\\Users\\lzp\\Desktop\\printSoft\\class.txt"); } /*** * @param logName 提取class明细 */ public void readAndCopy(String logName) { int count = 0; // 用于记录成功拷贝的类数 try { FileInputStream fi = new FileInputStream(logName); InputStreamReader ir = new InputStreamReader(fi); BufferedReader br = new BufferedReader(ir); String string = br.readLine(); while(string != null) { if(copyClass(string) == true) count++; else System.out.println("ERROR " + count + ": " + string); string = br.readLine(); } } catch (IOException e) { System.out.println("ERROR: " + e); } System.out.println("count: " + count); } /*** * 从原jar路径提取相应的类到目标路径,如将java/lang/CharSequence类从rt目录提取到rt1目录 * @param string 提取类的全路径 * @return * @throws IOException */ public boolean copyClass(String string) throws IOException { String classDir = string.substring(0,string.lastIndexOf("/")); String className = string.substring(string.lastIndexOf("/")+1,string.length()) + ".class"; boolean result =false; for(String jar : jarArr){ File srcFile = new File(source + "/"+jar+"/" + classDir + "/" + className); if(!srcFile.exists()) { continue; } byte buf[] = new byte[256]; FileInputStream fin = new FileInputStream(srcFile); /* 目标目录不存在,创建 */ File destDir = new File(dest + "/"+jar+"1/" + classDir); if(!destDir.exists()) destDir.mkdirs(); File destFile = new File(destDir + "/" + className); FileOutputStream fout = new FileOutputStream(destFile); int len = 0; while((len = fin.read(buf)) != -1) { fout.write(buf,0,len); } fout.flush(); result = true; break; } return result; } } 然后在将提取的class文件打包成jar文件,利用jar命令进行打包,然后替换以前的jar文件,这样lib就从以前的六十多M到几M多有,如图:

这样我们就完成了jre的瘦身!

整理JRE瘦身或精简JRE相关推荐

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

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

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

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

  3. 精简jre(JDK6瘦身)

    参考文章: http://glemir.xplore.cn/archives/200 http://blog.csdn.net/nsrainbow/archive/2008/04/26/2333206 ...

  4. 电脑c盘清理、电脑清理、电脑C盘成功瘦身15G左右

    ❤️电脑C盘清理 [1] 卸载没用软件 涉及人家软件版权投诉,就不一一列举了,可以私信或者留言. [2] C 盘瘦身cmd 命令行清理磁盘 [电脑上左下角四个白色方块键 R键 => 输入cmd ...

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

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

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

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

  7. 精简JRE第二步 ─ 精简lib目录

    http://jarg.iteye.com/blog/867960 JRE(Java Runtime Environment): Java运行环境. 打开JRE安装目录.目录包括bin,lib二个文件 ...

  8. Java 精简Jre

    很久之前我就有一个疑问,为什么甲骨文官方不出exe打包工具,我导出来的jar包才1.9mb,我却要把226兆的jre一起打包.这样子太麻烦了,每个程序都要打包一个不同版本的jre,如果不是这个,或许j ...

  9. java jre精简_精简 jre

    jre 文件结构 -bin (启动jvm虚拟机中必要的exe和dll) ​ --java.exe (java主程序,用于启动窗口程序或非阻塞程序 ) ​ --javaw.exe (用于启动 窗口程序或 ...

  10. 精简 jre (剪裁jdk)

    jre 文件结构 -bin (启动jvm虚拟机中必要的exe和dll) ​ --java.exe (java主程序,用于启动窗口程序或非阻塞程序 ) ​ --javaw.exe (用于启动 窗口程序或 ...

最新文章

  1. Windows驱动中的Crash回调
  2. api 原生hbase_HBase客户端API
  3. uo和o的区别和用法_汉语拼音中,o与uo有什么区别
  4. 【安全漏洞】SRC另类思路分享:不受限制的资源调用
  5. [Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性
  6. JS取消浏览器文本选中的方法
  7. 数据的“敏捷制造”,DataWorks一站式数据开发治理范式演进
  8. 数据结构-堆 C与C++的实现
  9. 如何才能通过一线互联网公司面试?全网疯传
  10. hdu 4313 Matrix 并查集 多校联合赛(二) 第四题
  11. ad怎么导入cad的外形尺寸_CAD文件导入AD09
  12. 2019 双十一京东全民养红包攻略分享
  13. matlab中函数imhist的用法
  14. 抢火车票,出行必备程序(12306bypass)--可以抛掉同程什么的抢票软件了
  15. ZooKeeper JMX enabled by default
  16. linux java调优
  17. macOS Monterey 12.6.2 (21G320) 正式版 ISO、IPSW、PKG 下载
  18. 【Camera专题】Sprd-深入浅出Camera驱动框架1(HAL层-Kernel层)
  19. 搜狗收录查询 怎么查搜狗是否收录过网页
  20. 微信小程序开发与oss防盗链

热门文章

  1. 系统安装之十 U盘安装原版win10
  2. 主流百兆交换机芯片介绍
  3. 完整的连接器设计手册_富士康的连接器设计手册
  4. 苹果macOS Big Sur 11.0.1 内置原生壁纸下载!!!
  5. 【图像融合】基于脉冲神经网络PCNN实现图像融合附matlab代码
  6. 基于 FastAPI 的房源租赁系统设计与实现
  7. 【补充】Python爬虫:为什么要使用IP代理
  8. 【MapGIS二次开发】常见问题解析
  9. 激光雷达障碍物检测:点云聚类算法
  10. 电脑窗口切换常用的快捷键有哪些