http://jarg.iteye.com/blog/867960

JRE(Java Runtime Environment): Java运行环境.
打开JRE安装目录.目录包括bin,lib二个文件夹.
1. bin: 可以认为这是Java虚拟机.
精简过程在本博客文章精简JRE第一步 ─ 精简bin目录 中有初步介绍.
2. lib: 执行class文件时,Java虚拟机需要用到的类库及资源文件.

① 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的内容.

本文主要介绍类库的精简过程,主要是rt.jar类库的精简过程.

一、准备工作
查看执行当前Java程序所需加载的所有类(由于Java中具有类延时加载的现象,所以要把程序所有的功能都运行一次才能得到运行当前Java程序需要用到的全部类),并保存所有用到的类名到log.txt中.
查看程序加载类的方法在本博客文章精简JRE - verbose命令 中有初步介绍.

二、修改log.txt
由于log.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的输出行.

java/lang/Object
java/io/Serializable
java/lang/Comparable
...
java/util/TreeMap$Entry
sun/misc/VM sun/nio/cs/ext/GBK
java/lang/StringCoding
java/lang/ThreadLocal$ThreadLocalMap
...
java/security/ProtectionDomain$Key
java/security/Principal java/lang/Shutdown
java/lang/Shutdown$Lock

三、类拷贝程序
上述形同java/lang/System的字符串,System是类名,相应System.class文件.java/lang为System.class在类库rt.jar中的相对路径.下面的类拷贝程序的目的就是从解压后的rt.jar的文件夹rt中将需要用到的类(也就是log.txt中记载的类)拷贝到别一个文件夹(这里为rt1)中,达到抽取运行当前Java程序需要全部类的目的.

import java.io.*;
public class CopyClass
{
public String src = "rt";        // 类源目录
public String dest = "rt1";      // 类拷贝目的目录
public CopyClass()
{
readAndCopy("log.txt");
}
public static void main(String[] args)
{
CopyClass obj = new CopyClass();
}
/* 读取log.txt中内容,并拷贝相应类 */
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);
}
/* 从rt中拷贝出class文件 */
public boolean copyClass(String string) throws IOException
{
String classDir = string.substring(0,string.lastIndexOf("/"));
String className = string.substring(string.lastIndexOf("/")+1,string.length()) + ".class";
/* class文件不存在,返回false */
File srcFile = new File(src + "/" + classDir + "/" + className);
if(!srcFile.exists())
{
return false;
}
byte buf[] = new byte[256];
FileInputStream fin = new FileInputStream(srcFile);
/* class目录不存在,创建 */
File destDir = new File(dest + "/" + 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();
return true;
}
}

程序运行要求: 事先解压rt.jar类库到该类拷贝程序所在目录

四、精简rt.jar
将拷贝出来的类打包成rt.jar.
1. 用jar打包命令打包.
2. 用压缩程序(如: winrar)压缩成rt.zip(不能是.rar格式),然后重命令为rt.jar.

五、精简charsets.jar
charsets.jar包含执行程序所需的编码方式,但是通常我们只会用到其中的一种.根据类拷贝程序提示的错误信息,将相应的类拷贝出来打包成charsets.jar,完成精简charsets.jar的工作.

至此完成本文要介绍的内容: 精简lib目录.

  • 大小: 35.8 KB
  • 大小: 6.8 KB
  • log.rar (2.2 KB)
  • 下载次数: 22

精简JRE第二步 ─ 精简lib目录相关推荐

  1. 精简jre(JDK6瘦身)

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

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

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

  3. JRE极限精简探求手册 1 ——精简一个Swing的即时战略游戏

    本例中以GreenJVM直接压缩精简后绿色版游戏下载地址:http://download.csdn.net/source/612943 本回主在描述精简一个Java应用的实际步骤,选取了ApoDefe ...

  4. JRE极限精简探求手册[1]——精简一个Swing的即时战略游戏

    该作者信息可以在[url]http://home.arcor.de/newbielein/[/url]获得,这是一个德文网页,作者也提供了其它一些小型Java游戏的展示,比如: 有兴趣的可以下载作为参 ...

  5. Java 精简Jre

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

  6. java jre精简_精简 jre

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

  7. 精简 jre (剪裁jdk)

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

  8. java精简jre打包(jdk14、15)

    自己也搭建了个新的博客,部分文章与csdn同步.本文在我的新博客同样可以看到:http://spzgczyj.top/blog/ 在此之前,我曾经写过Java 精简Jre,Java 精简Jre_水瓶座 ...

  9. lib目录和maven dependency目录的jar包冲突

    用eclipse时新建项目时,会在lib目录下自动生成一些jar包,然后又在pom.xml文件中添加了依赖,导致lib下的jar包和maven dependency目录下的jar包产生了冲突.刚开始r ...

最新文章

  1. OpenGL中的VAO和VBO使用技巧
  2. 暑期集训5:并查集 线段树 练习题A:  HDU - 1232 ​​​​​​​
  3. 使用es6中import和export报错
  4. Android Studio导入github项目详解
  5. python常用数据结构
  6. UA MATH566 统计理论5 假设检验简介
  7. struts、hibernate、spring、 mybatis、 spring boot 等面试题汇总
  8. f12 卡 谷歌浏览器_抢券第二课:利用浏览器F12获取优惠券请求链接
  9. InVEST model中生境质量
  10. 在AIX 5.3+HACMP 5.4以上环境安装10gR2 10.2.0.1 RAC CRS Clusterware必须先运行Patch 6718715中的rootpre.sh...
  11. Hive(五)——查询
  12. 【JZOJ4790】【NOIP2016提高A组模拟9.21】选数问题
  13. 使用DOM4J解析大容量XML文件
  14. java成绩管理系统代码_[转载]我写的Java学生成绩管理系统源代码
  15. 博图多版本共存安装教程 博图V14V15V16V17下载地址
  16. QQ这个版本已经绝版。
  17. T检验与F检验的区别_f检验和t检验的关系
  18. Microsoft Store连不上网解决办法
  19. 【瑞萨RA4系列】开发环境搭建和点灯指南
  20. excel求方差和标准差的函数_Excel计算方差和标准差

热门文章

  1. 微信终端自研 C++协程框架的设计与实现
  2. 深入理解 Lua 虚拟机
  3. Google: 如何做code review?
  4. OCP大会 | 腾讯云Open DCN Networking(附PDF)
  5. devstack安装OpenStack Pike版本 (OVN+VLAN)
  6. Maven最全教程,还有哪里对maven不解的地方看过来!
  7. 面试官如何考察你的思维方式?【比较有趣】
  8. 利剑无意之面试题(二)
  9. 【Ajax Servlet JSP MySQL】Ajax实现省份地区选择:三级联动
  10. Leet Code OJ 88. Merge Sorted Array [Difficulty: Easy]