`
yeshaoting
  • 浏览: 667422 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

 

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)
  • 下载次数: 53
3
1
分享到:
评论

相关推荐

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

    2. 删除jre目录下所有出bin和lib目录的所有文件或目录 3. 打开cmd窗口,设置path路径为空,转到D:\jre\bin目录,运行java –version。正常显示当前Java的版本。 4. 在bin目录中新建一个temp目录,将除java.exe和java...

    精简 jre 效果程序

    精简 jre 效果 程序

    exe4j+精简jre实例

    笔者精简了jre,并给出一个可用实例,笔者有一个java项目,已经对jre进行精简,制作了可执行包,从140M减到了20M,在精简jre的过程中,笔者也写了一些脚本和代码,旨在过程化该解决方案, 但是由于使用了exe4j,而...

    精简版jre1.8(wins 64位,附压缩教程)

    最近在写一个java开发的游戏,jre1.8.0_181整整有199mb,对于一个只有400多k的游戏来说,完全没必要,于是就进行精简,把jre精简到22.5mb,游戏也能正常运行。如果你急需使用精简的jre,可以下载试试。本来想精简到...

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

    NULL 博文链接:https://jarg.iteye.com/blog/860896

    精简的jre和精简过程

    最近在写一个小程序,jre1.8.0_181整整有199mb,对于一个只有400多k的程序来说,完全没必要,于是就进行精简,把jre精简到40M、左右,程序也能正常运行。如果你急需使用精简的jre,可以下载试试。

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

    适合需要通过java开发桌面程序的小朋友

    Java Portable 1.8.0.181 绿色便携精简JRE & JDK &

    Java Portable 1.8.0.181 绿色便携精简JRE, jPortable在线安装后提取版。最大化保持功能版。7z压缩后44M解压后162M。可配合便携版360极速浏览器,firefox等浏览器使用,使便携式java随时可用

    JRE瘦身 jre减肥 精简jre jre精简

    因为很多用户的电脑上没有合适版本的jre。用一个软件的同时必须安装另外一个软件(jre)会给人一种流氓软件强行捆绑的感觉,而很多用户对此很抵触。更不要提用户电脑上的jre版本千变万化(有没有jre,是微软的还是...

    制作桌面软件exe执行文件和精简jre步骤.zip

    制作桌面软件exe执行文件和精简jre步骤

    精简JRE - 实例Swing计算器 with 精简JRE

    NULL 博文链接:https://jarg.iteye.com/blog/868287

    精简版本jre

    精简版jre

    精简的jre的精简工具

    GreenJVMMake - CSDN下载 下载 这是一个配合GreenJVM使用的JRE精简工具,可以动态的获取应用程序中对于rt.jar的class依赖,并根据依赖关系自动构成精简后的rt.jar.

    精简JRE(windows32位和64位,linux 32位和64位)

    精简JRE(windows32位和64位,linux 32位和64位)。 JRE 的精简主要是rt.jar的精简,会删除无用的class。

    Jre8精简基础镜像包

    制作 docker 精简 jre8 基础镜像,基础镜像为bitnami/minideb,jdk8u321版本,已解决httpclient中文乱码和webservice-client缺包问题。

Global site tag (gtag.js) - Google Analytics