`
yaojialing
  • 浏览: 255766 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(转)精简JRE第二步 ─ 精简lib目录

    博客分类:
  • JVM
阅读更多

文章转自:http://jarg.iteye.com/blog/867960

 

 

JRE(Java Runtime Environment): Java运行环境.

 

 

 


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代码 复制代码 收藏代码
  1. java/lang/Object    
  2. java/io/Serializable    
  3. java/lang/Comparable    
  4. ...    
  5. java/util/TreeMap$Entry    
  6. sun/misc/VM sun/nio/cs/ext/GBK    
  7. java/lang/StringCoding    
  8. java/lang/ThreadLocal$ThreadLocalMap    
  9. ...    
  10. java/security/ProtectionDomain$Key    
  11. java/security/Principal java/lang/Shutdown    
  12. java/lang/Shutdown$Lock  
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程序需要全部类的目的.

Java代码 复制代码 收藏代码
  1. import java.io.*;   
  2.   
  3. public class CopyClass   
  4. {   
  5.     public String src = "rt";       // 类源目录   
  6.     public String dest = "rt1";     // 类拷贝目的目录   
  7.   
  8.     public CopyClass()   
  9.     {   
  10.         readAndCopy("log.txt");   
  11.     }   
  12.   
  13.     public static void main(String[] args)   
  14.     {   
  15.         CopyClass obj = new CopyClass();   
  16.     }   
  17.   
  18.     /* 读取log.txt中内容,并拷贝相应类 */  
  19.     public void readAndCopy(String logName)   
  20.     {   
  21.         int count = 0;  // 用于记录成功拷贝的类数   
  22.         try  
  23.         {   
  24.             FileInputStream fi = new FileInputStream(logName);   
  25.             InputStreamReader ir = new InputStreamReader(fi);   
  26.             BufferedReader br = new BufferedReader(ir);   
  27.   
  28.             String string = br.readLine();   
  29.             while(string != null)   
  30.             {   
  31.                 if(copyClass(string) == true)   
  32.                     count++;   
  33.                 else  
  34.                     System.out.println("ERROR " + count + ": " + string);   
  35.                 string = br.readLine();   
  36.             }   
  37.         }   
  38.         catch (IOException e)   
  39.         {   
  40.             System.out.println("ERROR: " + e);   
  41.         }   
  42.         System.out.println("count: " + count);   
  43.     }   
  44.   
  45.     /* 从rt中拷贝出class文件 */  
  46.     public boolean copyClass(String string) throws IOException   
  47.     {   
  48.         String classDir = string.substring(0,string.lastIndexOf("/"));   
  49.         String className = string.substring(string.lastIndexOf("/")+1,string.length()) + ".class";   
  50.            
  51.         /* class文件不存在,返回false */  
  52.         File srcFile = new File(src + "/" + classDir + "/" + className);   
  53.         if(!srcFile.exists())   
  54.         {   
  55.             return false;   
  56.         }   
  57.         byte buf[] = new byte[256];   
  58.         FileInputStream fin = new FileInputStream(srcFile);   
  59.   
  60.         /* class目录不存在,创建 */  
  61.         File destDir = new File(dest + "/" + classDir);   
  62.         if(!destDir.exists())   
  63.             destDir.mkdirs();   
  64.   
  65.         File destFile = new File(destDir + "/" + className);   
  66.         FileOutputStream fout = new FileOutputStream(destFile);   
  67.         int len = 0;   
  68.         while((len = fin.read(buf)) != -1)   
  69.         {   
  70.             fout.write(buf,0,len);   
  71.         }   
  72.         fout.flush();   
  73.         return true;   
  74.     }   
  75. }  
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目录.




打开JRE安装目录.目录包括bin,lib二个文件夹.

分享到:
评论

相关推荐

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

    本篇文章将深入探讨如何精简JRE中的"lib"目录,以满足定制化需求。 "lib"目录是JRE的核心组成部分,包含了Java运行时所需的大量类库。这些库支持Java语言特性、网络通信、I/O操作、安全管理等多个方面。精简这个...

    精简jre步骤 迷你jre制作过程

    精简jre步骤 1. 拷贝一个完整版的jre文件夹到D盘 2. 删除jre目录下所有出bin和lib目录的所有文件或目录 3. 打开cmd窗口,设置path路径为空,转到D:\jre\bin目录,运行java –version。正常显示当前Java的版本。 4. ...

    精简JRE第一步 — 精简bin目录

    标题“精简JRE第一步 — 精简bin目录”涉及到的是Java运行环境(Java Runtime Environment, JRE)的优化过程,尤其是针对其中的`bin`目录。在Java应用程序部署时,完整JRE通常会占用较大的磁盘空间,对于只需要运行...

    精简版jre.zip 64位 1.8.0压缩后才20M

    - `jre`下的子目录可能还包含`lib/ext`,用于放置扩展库;`conf`,存放配置文件;`legal`,包含许可协议等法律文件。 总的来说,这个精简版的64位Java 1.8.0 JRE为轻量级的Java应用运行提供了便捷,是初学者和资源...

    超级精简版的jre

    通常,精简版JRE会包含以下几个关键目录和文件: - `bin`:存放可执行文件,如`java`、`javaw`等。 - `lib`:存放Java类库和其他支持文件。 - `jre`(有可能是嵌套结构):在某些精简版中,JRE内部也会有精简处理。...

    jre精简工具及教程

    2. **选择精简工具**:有许多工具可以帮助我们定制和精简JRE,例如: - **Excelsior JET**:这是一个强大的Java编译器和运行时,可以将Java代码转换为本地机器代码,并允许定制JRE。 - **Java Packager**:这是...

    自己动手精简你的jre到做小

    自己动手精简我们jre,再打包成exe...感兴趣的可以下载后动手精简一下你的jre,我的精简到了2M以内,做成exe后根本看不出来是java做的。里面包含了删减lib,bin下文件的方法和步骤,让你的jre最小化!祝你编程愉快!

    精简的jre,及精简工具

    请不要下载,有些问题,有的程序无法使用。 精简了jdk1.6的jre 精简工具是GreenJVMMake.jar 下载后GreenJVMMake.jar不用解压,直接使用(将...用它覆盖掉jre\lib\rt.jar 如果还不行就使用java -jar myapp.jar查看问题

    jre-超级精简GreenJVM版

    标题中的"jre-超级精简GreenJVM版"指的是一个特别优化和精简的Java运行环境(Java Runtime Environment, JRE),它被称为GreenJVM。这个版本可能针对特定的性能需求或者轻量级设备进行了定制,以实现更快的启动速度...

    精简的JRE7的资源

    至于压缩包中的文件名称列表只有一个“jre7”,这可能是压缩包本身的名称,解压后可能会展开成一个包含多个子目录和文件的结构,如bin(包含可执行文件)、lib(包含Java类库)、conf(配置文件)等。在这个精简版中...

    精简后jre(1)

    Java运行时环境(Java Runtime Environment,简称JRE)是Java应用程序执行所需的基础组件,它包含了Java虚拟机...因此,在创建和使用精简JRE时,必须确保它包含运行目标应用所需的所有组件,并进行充分的测试验证。

    对jre包里的rt.jar精简

    对jre包里的rt.jar精简,第一步:解压工具.rar,第二步:把你打包的jar小项目放到同一文件夹里。第三步:cmd,运行命令javaw -Dfile.encoding=utf-8 -jar GreenJVMMake.jar -t da -i ./mytest.jar -o ./ 执行后可以...

    精简版JRE7 64位 (6MB)

    在压缩包文件名称列表中只提到了"jre7",这意味着压缩包可能包含JRE7的所有必要文件,包括bin目录下的可执行文件(如java.exe)、lib目录下的类库文件以及必要的配置文件。为了使用这个精简版JRE,用户需要将解压后...

    windows_64位_1.7_精简版jre

    《Windows 64位1.7精简版JRE详解》 Java运行环境(Java Runtime Environment,简称JRE)是Java程序运行的基础,它包含了Java虚拟机(Java Virtual Machine,JVM)、Java类库以及相关的支持文件。在本文中,我们将...

    jre-超级精简普通版版

    2. **lib**:这个目录包含Java类库,如基础类库(rt.jar)、本地方法库(native libraries)和一些工具库。精简版可能会移除一些非必要的库,以减少体积,例如针对特定技术或应用的扩展库。 为了在实际环境中使用这...

    jre 1.6免安装精简版

    在压缩包子文件的文件名称列表中仅列出了"jre",这可能代表压缩包内包含了完整的JRE目录结构,包括bin(存放可执行文件如java、javaw等)、lib(包含Java类库)、jre(可能还有子目录结构,如lib、bin等)以及可能的...

    jre1.6免安装精简版

    6. **文件名称列表**:只有一个名为"jre"的文件,这可能是压缩包的主文件名,实际解压后可能包含Java运行环境的各种组件,如bin目录下的可执行文件(如java.exe、javaw.exe等)、lib目录下的类库文件、man目录下的...

    精简版的jre6,绝对能支持桌面swing程序。

    精简版的lib目录可能会剔除了一些与Swing无关或者非必要的库,以达到减小体积的目的。 对于开发者来说,这个精简版的JRE6提供了一种轻量级的解决方案,可以在不牺牲Swing应用性能的前提下降低系统的负担。如果你的...

    瘦身JRE让其变成 5M左右

    8. **注意事项**:精简JRE需谨慎,因为删减过度可能导致某些Java应用程序无法正常运行。因此,精简过程应基于具体的应用场景和需求,确保保留所有必需的类和库。 9. **应用价值**:精简后的JRE适用于资源受限的环境...

    将jar打包成exe并动态绑定jre再打包成安装文件

    - 第2步:选择“JAR in EXE”模式,导入已经打包好的jar文件。 - 第3步:填写项目名称,指定输出exe文件的目录。 - 第4步:根据程序类型选择图形界面或控制台模式,填写exe文件名和图标。 - 第5步:添加主jar...

Global site tag (gtag.js) - Google Analytics