jre7精简

转自http://blog.csdn.net/xiaoping8411/article/details/6973887

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

[html]  view plain copy
  1. /*  
  2. @author jarg  
  3. @TODO 举例查看当前程序必需的dll文件  
  4. */  
  5. import java.io.InputStreamReader;  
  6. import java.io.IOException;  
  7.   
  8. public class Hello  
  9. {  
  10.     public static void main(String[] args) throws IOException  
  11.     {  
  12.         InputStreamReader ir = new InputStreamReader(System.in);  
  13.         System.out.println("Hello");  
  14.         ir.read();  
  15.     }  
  16. }  
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程序时所加载的所有类,如:

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

[plain]  view plain copy
  1. [Loaded java.lang.Math from shared objects file]  
  2. [Loaded java.nio.charset.Charset$3 from C:\Java\jdk1.6.0_16\jre\lib\rt.jar]  
  3. [Opened C:\Java\jdk1.6.0_16\jre\lib\charsets.jar]  
  4. [Loaded sun.nio.cs.AbstractCharsetProvider from C:\Java\jdk1.6.0_16\jre\lib\rt.jar]  
  5. [Loaded sun.nio.cs.ext.ExtendedCharsets from C:\Java\jdk1.6.0_16\jre\lib\charsets.jar]  
  6. [Loaded java.lang.Class$1 from shared objects file]  
  7. [Loaded sun.reflect.ReflectionFactory$1 from shared objects file]  
  8. [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就剩下如下信息:

[plain]  view plain copy
  1. java/lang/Object  
  2. java/io/Serializable  
  3. java/lang/Comparable  
  4. java/lang/CharSequence  
  5. java/lang/String  
  6. java/lang/reflect/GenericDeclaration  
  7. .......  


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

[java]  view plain copy
  1. import java.io.BufferedReader;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStreamReader;  
  7.   
  8. public class CopyClass  
  9. {  
  10.     private String source = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\";      // 类源目录  
  11.     private String dest = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\";        // 类拷贝目的目录  
  12.     String[] jarArr = new String[]{"rt","charsets"};  
  13.     /*** 
  14.      *  
  15.      * @param source 类源目录 
  16.      * @param dest   类拷贝目的目录 
  17.      * @param jarArr 需要的提取的jar文件 
  18.      */  
  19.     public CopyClass(String source,String dest,String[] jarArr){  
  20.         this.source=source;  
  21.         this.dest=dest;  
  22.         this.jarArr=jarArr;  
  23.     }  
  24.   
  25.     public static void main(String[] args)  
  26.     {  
  27.         String[] jarArr = new String[]{"rt","charsets"};  
  28.         CopyClass obj = new CopyClass("C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\",  
[java]  view plain copy
  1.                                                          "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\",jarArr);  
  2.         obj.readAndCopy("C:\\Users\\lzp\\Desktop\\printSoft\\class.txt");  
  3.     }  
  4.   
  5.     /*** 
  6.      * @param logName 提取class明细 
  7.      */  
  8.     public void readAndCopy(String logName)  
  9.     {  
  10.         int count = 0;  // 用于记录成功拷贝的类数  
  11.         try  
  12.         {  
  13.             FileInputStream fi = new FileInputStream(logName);  
  14.             InputStreamReader ir = new InputStreamReader(fi);  
  15.             BufferedReader br = new BufferedReader(ir);  
  16.   
  17.             String string = br.readLine();  
  18.             while(string != null)  
  19.             {  
  20.                 if(copyClass(string) == true)  
  21.                     count++;  
  22.                 else  
  23.                     System.out.println("ERROR " + count + ": " + string);  
  24.                 string = br.readLine();  
  25.             }  
  26.         }  
  27.         catch (IOException e)  
  28.         {  
  29.             System.out.println("ERROR: " + e);  
  30.         }  
  31.         System.out.println("count: " + count);  
  32.     }  
  33.   
  34.     /*** 
  35.      * 从原jar路径提取相应的类到目标路径,如将java/lang/CharSequence类从rt目录提取到rt1目录 
  36.      * @param string 提取类的全路径 
  37.      * @return 
  38.      * @throws IOException 
  39.      */  
  40.     public boolean copyClass(String string) throws IOException  
  41.     {  
  42.         String classDir = string.substring(0,string.lastIndexOf("/"));  
  43.         String className = string.substring(string.lastIndexOf("/")+1,string.length()) + ".class";  
  44.           
  45.         boolean result =false;  
  46.           
  47.         for(String jar : jarArr){  
  48.             File srcFile = new File(source + "/"+jar+"/" + classDir + "/" + className);  
  49.             if(!srcFile.exists())  
  50.             {  
  51.                 continue;  
  52.             }  
  53.               
  54.             byte buf[] = new byte[256];  
  55.             FileInputStream fin = new FileInputStream(srcFile);  
  56.   
  57.             /* 目标目录不存在,创建 */  
  58.             File destDir = new File(dest + "/"+jar+"1/" + classDir);  
  59.             if(!destDir.exists())  
  60.                 destDir.mkdirs();  
  61.   
  62.             File destFile = new File(destDir + "/" + className);  
  63.             FileOutputStream fout = new FileOutputStream(destFile);  
  64.             int len = 0;  
  65.             while((len = fin.read(buf)) != -1)  
  66.             {  
  67.                 fout.write(buf,0,len);  
  68.             }  
  69.             fout.flush();  
  70.             result = true;  
  71.             break;  
  72.         }  
  73.         return result;  
  74.     }  
  75. }  
然后在将提取的class文件打包成jar文件,利用jar命令进行打包,然后替换以前的jar文件,这样lib就从以前的六十多M到几M多有,如图:



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


PS:有几点需要注意

1、使用verbose的时候要将自己的程序所有功能执行完在关闭,因为有些程序执行中还会加载类,本人是在做一个swing程序的时候出现的

2、文中未rt.jar重新打包的方法,对于一些初学者可能有难度,在此说明,dos 进入类拷贝目录的目的目录,rt中,rt子目录就是com、sun、awt等目录了,输入  jar cvf rt.jar * 即可,同样charsets.jar 打包  为进入 charsets目录中,jar cvf charsets.jar *

在此感谢博主http://blog.csdn.net/xiaoping8411/article/details/6973887

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/143626.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

mysql 2005开发版_Microsoft SQL Server 2005简体中文开发版下载

Microsoft SQL Server 2005 开发版使开发人员能够在32位和X64平台的基础上建立和测试任意一种基于SQL Server 的应用系统。它包括企业版所有功能,但只被授权用于开发和测试系统,不能作为生产服务器。开发版可被升级至SQL Server 企业版以用于生产。 Microsoft 已重新设计了 S…

计算机2级ps真题百度云,【百度盘】Adobe Photoshop 2020 释怀特别版 | 21.2.1.265 | 633MB...

免责声明:本系列软件仅供个人测试使用,不保证软件稳定性,欢迎大家支持和使用正版。 软件修改概况(以下修改内容适用释怀的2018、2020版) -精简运行库及更新组件; -精简创意云Creative Cloud Libraries组件及插件; -精简…

dreamwaver cs6

引用:http://www.aa25.cn/download/954.shtml Adobe dreameaver CS6发布了,官方也放出正式版下载了,建议大家更新到最新版本,因为它给我们提供了更新的功能,比如对html5及css的支持,jqurey的支持等等。 这里提供的官方…

计算机中怎样重新安装ps,什么样的电脑适合安装高版本Photoshop?该如何安装和卸载PS呢?...

由于每一款软件都是在不断升级和完善中,只有这样才能不断的满足实际应用的要求,比如Photoshop这一款软件以及在Photoshop CS6之后改名为Photoshop CC版本,目前最新版已经到Photoshop CC 2019版本,由于就有很多小伙伴想第一时间尝试最新版本的一些新功能和技巧,但是新版本的…

Adobe Photoshop CS3绿色精简版(26M)

Adobe Photoshop CS3官方简体中文版精简优化制作而成 只保留Photoshop组件,精简了其它组件及帮助文件和样本文件 基本上保留了原版Photoshop的全部设计功能 增加了功能强大的eye candy、DCE Tools、xenofex2等滤镜。 无需注册或激活。自解压文件(解压…

java开发ps插件_超强自主开发的Photoshop CS6增强插件 唯一的面板测试版2

超强自主开发的Photoshop CS6增强插件 唯一的面板测试版2 热心网友2012.10.11Photoshop 适用于Photoshop CS6的增强插件下载。具有增强对齐,加入类似CDR的前进后退按钮方便效果查询,CTRLZ方便,CtrlshiftZ就不常用了,所以在微调效果…

win10系统,安装Photoshop_CS6并且无需序列号破解

最近想学习前端,就想着顺便把PS下一下,哪知道居然总是安装失败……以下是安装步骤和破解步骤以及遇到的问题 必看:安装、破解软件全程断网!下载的问题 【这里给一个包含破解补丁的链接http://www.frontopen.com/1181.html】 随便在…

css插件载进去ps里面,CSS3Ps(ps图层插件)官方版

CSS3Ps是一款功能使用的图层转换工具,通过此软件能够帮助我们将图层快速转换为能够在浏览器可以查看的CSS3代码,方便您直接在设计软件中添加相关的设计程序,可以选择多个图层或者一个图层,并通过点击转换实现批量处理功能&#xf…

Photoshop CS6 Extended 特别版特点介绍

Photoshop CS6 Extended 32/64位中文特别版特点: 1:采用官方正式版安装文件APM更新 13.1.2 进行提取制作 2:采用可保留 Extende d功能的破解补丁整合,支持3D功能 3:精简多国语言,帮助文件,多国 …

怎样正确安装Photoshop CS6破解版【图文教程】

PS作为一款强大的图片处理软件,受到了广大电脑爱好者的喜爱,它的版本也在不断的更新中,功能也在不断地完善。现在最新的版本则是CS6,本人也才刚刚更新完毕。更新的过程中遇到了很多问题,相信很多人也会遇到一些同样的问…

Adobe Photoshop CS6 for Mac 简体中文 支持retina高清屏

Adobe Photoshop CS6 for mac是Adobe公司旗下最为出名的图像处理软件之一,集图像扫描、编辑修改、图像制作、广告创意,图像输入与输出于一体的图形图像处理软件。 PS相关滤镜下载: Nik Color Efex Pro for Mac 后期处理 调色滤镜&#xff1a…

虽然我不再年轻,纵然我们都已年华老去。

引子 著名华裔芭蕾舞舞蹈家傅予心女士于旧金山空难中去世,享年五十九岁。 几天后,蔡娅受母亲所托,前往表姑姑傅予心的公寓整理遗物。 傅予心曾是一名出色的舞者,却在事业如日中天时告别舞台,回国定居。蔡娅一直不明所以…

12月18日第壹简报,星期日,农历十一月廿五

12月18日第壹简报,星期日,农历十一月廿五1. 官方:预计我国今年经济总量超过120万亿元,明年经济有望总体回升。2. 多地血库告急,两部门修改“指引”:最后一次新冠核酸或抗原阳性结果7天后可献血。3. 北京&am…

阿里程序员每天都沮丧想离职,天天去厕所哭,还看了心理医生

阿里是许多程序员的梦想之地,但它却更像是个围城。没进去的人想进去,进去的人想逃离。 一个阿里的同学哭诉自己来到阿里后每天都沮丧,想离职,去厕所哭了N次,还去看了心理医生,问大家还要不要熬下去&#x…

忆往昔,峥嵘岁月稠

盼望着盼望着,研究生考试结束了,虽然对于这次考试只准备了3个月,但是这漫长的3个月对于我们来说确实快乐和折磨并存的。隐约记得是10月的一天,我们便开始了研究生的征战之旅。 一、走过的路。 10月之后,便着手准备考研…

燃情岁月

燃情岁月  充满着温情和阳刚之气的经典之作恍如隔世的成人童话记录西部风光的伟大史诗富有创新求变的"独立电影"精神  1994年出品导 演:爱德华兹维克 主 演:布拉德皮特    安东尼霍普金…

致那逝去的青春岁月

大家好,我是浙江大学计算机学院2020届的硕士毕业生。目前就职于阿里云IoT部门,从事物联网操作系统及IoT小程序相关的工作。在毕业一年之际,我怀着无比怀念的心情写下了这篇文章,主要介绍自己大学期间的经历,以及毕业时…

《奥黛丽·赫本》一辈子活在优雅里

《奥黛丽赫本》一辈子活在优雅里 奥黛丽赫本:1929/05/04-1993/01/20,英国女演员,凭电影《罗马假日》获奥斯卡最佳女演员奖。投身公益事业,一生荣誉无数。 美国四大艺术奖项——电影奥斯卡奖、戏剧托尼奖、音乐格莱美奖和电视艾美奖…

满脸沧桑

昨日高中同学结婚,大家借此机会小聚了一下,大概有1、2十个人吧,近10年未见,变化还是不小,有几个没有同班过的同学已经没有什么印象了。 印象最深的是这几个字:满脸沧桑!因为针对的对象都是我&…