前不久给朋友做了一个桌面程序,程序文件没多大,但运行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的瘦身!

java jre 减少尺寸_整理JRE瘦身或精简JRE相关推荐

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

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

  2. APK瘦身记,如何实现高达53%的压缩效果

    原文链接:http://drops.wooyun.org/mobiledev/14289#more-14289 0x00 我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话 ...

  3. 京东商城iOS客户端安装包瘦身实践

    一.概述 随着业务的快速增加,商城app的大小也在迅速增加,一度超过了300M.安装包大小的不断增加对app下载成本,推广效率产生了比较大的影响.从2018年9月份我们对商城app开始了为期二期的专项 ...

  4. 每天喝6杯清水,就能轻松瘦身!

    王歌:每天喝6杯清水,就能轻松瘦身! 一.喝水可以运出体内垃圾,清除体内毒素 水既是营养进入细胞的载体,又是体内毒素的运送者.要想身体健康,迅速排除毒素,白开水是最好的饮料,每天喝八杯可加速新陈代谢, ...

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

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

  6. 安装jre运行环境_如何下载安装java运行环境jre

    如果你只需要运行Java程序或Applet,下载并安装它即可.如果你要自行开发Java软件,请下载JDK.在JDK中附带有JRE.注意由于Microsoft对Java的支持不完全,请不. . Java ...

  7. java开发必须安装jre吗_安装jdk后还需要安装jre吗

    展开全部 不需要,安装jdk的时候就会把jre一起安装了. J2RE是Java2 Runtime Environment,即Java运行环境,只是强62616964757a686964616fe59b ...

  8. java怎么改默认工作区_如何更改缺省JRE所有的Eclipse工作区?(How to change default JRE...

    我有一个JRE在C:\Program Files (x86)\Java\jre6 ,那是在我安装了Eclipse的时间只有一个. 我后来在安装和完整的JDK C:\home\SFTWR\jdk1.6. ...

  9. java jre精简_精简 jre

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

最新文章

  1. 适合程序员的画图工具
  2. Ruby中的Mixin
  3. python基础语法类型_Python基础入门语法和变量类型(一)
  4. 解析ThreadPoolExecutor类是如何保证线程池正确运行的
  5. c语言指针代码大全,C语言之指针(示例代码)
  6. 用5毛特效,让1000万人上瘾!这群乡村大妈,打了所有流量明星的脸
  7. 【hortonworks/registry】registry 如何创建 互相依赖的 schema
  8. 建站如此容易:WordPress3.9建站简明视频教程完成发布啦
  9. 【PostgreSQL-9.6.3】修改监听的IP和端口
  10. vue导出excel表格(详细教程)
  11. ssm基于Java web的校园滴滴代驾管理系统毕业设计源码260839
  12. ext4文件系统数据恢复的方法总结
  13. Mybatis CRUD操作和多表查询
  14. Blender建模练习:人物模型多边形建模流程图解(二形体调整篇)
  15. c#录音和放音,超简单!不用DirectX
  16. R语言初级教程(02): RStudio的使用
  17. Jetson Nano交叉编译教程
  18. nginx学习笔记七(nginx HTTP框架的执行流程)
  19. 名帖220 赵孟頫 行书《光福寺重建塔记》
  20. 抛硬币吃苹果的概率问题

热门文章

  1. 随机分析 || 鞅不等式 —— Doob不等式、BDG不等式、指数鞅不等式
  2. 数字孪生技术搭建的智慧楼宇安防综合管控系统,在智慧城市发展中有何亮点?
  3. 平面设计和UI设计有哪些区别?
  4. 综合布线系统工程有关的技术
  5. mysql select 导出_mysql利用sql语句将查询结果导出
  6. python pandas excel数据处理_Python处理Excel数据-pandas篇
  7. AutoCAD机械制图英语词汇
  8. nod32永久升级补丁
  9. 基于springboot的微信公众号管理系统(支持多公众号接入)
  10. 关于win10几分钟无任何操作就假死机,就只有鼠标能动