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

精简jre(JDK6瘦身)

    博客分类:
  • JVM
阅读更多

参考文章:

http://glemir.xplore.cn/archives/200

http://blog.csdn.net/nsrainbow/archive/2008/04/26/2333206.aspx

 

这里结合参考的文章和网上的一些JRE瘦身经验说下我精简JRE的过程。

 

精简过的JRE一般都不是通用的,都是针对自己的应用程序把不需要的类去掉,从而达到精简目的。所以有些人想拿别人精简过的JRE运行自己的应用程序,这样是不靠谱的。最后还是得自己动手精简,过程也挺简单。

 

思路:

把自己的应用程序打包成jar,然后通过jar命令运行这个jar,把jar所需的类全部打印到一个文本文件里面,把文本文件里面的类提取出来,重新打包。覆盖JRE目录中的JAR包。去掉JRE下bin目录和lib目录中不需要得。瘦身完成。

 

应用程序打包后是test.jar,jre(目录) 也和它同一文件夹,写一个CMD脚本方便测试:

@echo off
set path=./jre6/bin
java -jar -verbose:class test.jar >>class.txt
pause

 

这样程序使用的就是当前目录下的jre,程序运行后,最好把所有的功能使用一遍,这样输出了一个文件class.txt,里面有所有需要的class,其格式如下:

[Opened D:\data\dict\jre\lib\rt.jar]
[Loaded java.lang.Object from D:\data\dict\jre\lib\rt.jar]
[Loaded java.io.Serializable from D:\data\dict\jre\lib\rt.jar]
[Loaded java.lang.Comparable from D:\data\dict\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from D:\data\dict\jre\lib\rt.jar]
[Loaded org.apache.lucene.index.CompoundFileReader$FileEntry from file:/D:/data/dict/dict.jar]

输出的class文件里面可能还包含其他应用的jar包,如:charsets.jar。这样就需要把class文件里面的信息按rt和charsets分成两类分别放到两个txt文件里面:rt_class.txt,charsets.txt

我们依照这个文件来裁剪rt.jar:
首先在utralEdit中进行一些处理,去掉所有不是rt.jar中的class的行,去掉from后面的,去掉loaded等无关项目,再把“.”替换成“/”.这个可以利用正则表达式等轻松处理。处理完后得到的文件类似如下格式:

 rt_class.txt

java/lang/Object
java/io/Serializable
java/lang/Comparable
java/lang/CharSequence
java/lang/String 

 

我们依照这个文件来裁剪charsets.jar:
首先在utralEdit中进行一些处理,去掉所有不是charsets.jar中的class的行,去掉from后面的,去掉loaded等无关项目,再把“.”替换成“/”.这个可以利用正则表达式等轻松处理。处理完后得到的文件类似如下格式:

charsets.txt

sun/nio/cs/ext/ExtendedCharsets 
sun/nio/cs/ext/GBK 
sun/nio/cs/ext/DoubleByteDecoder 
sun/nio/cs/ext/GBK$Decoder 
sun/nio/cs/ext/DoubleByteEncoder 
sun/nio/cs/ext/GBK$Encoder 

 然后写一个脚本或者程序处理,从rt或charsets中把需要的的class拷贝到另一个对应的文件夹rt1或charsets1,这里参考网上的一个JAVA抽取程序。

 

在运行下面JAVA程序之前需要将JRE目录中rt.jar,charsets.jar分别解压到相应目录

 

代码如下:

package com.ccic.greenjvm;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

public class ReduceRt {
	// 文件拷贝
	public static boolean copy(String file1, String file2) {
		try // must try and catch,otherwide will compile error
		{
			// instance the File as file_in and file_out
			java.io.File file_in = new java.io.File(file1);
			java.io.File file_out = new java.io.File(file2);
			FileInputStream in1 = new FileInputStream(file_in);
			FileOutputStream out1 = new FileOutputStream(file_out);
			byte[] bytes = new byte[1024];
			int c;
			while ((c = in1.read(bytes)) != -1)
				out1.write(bytes, 0, c);
			in1.close();
			out1.close();
			return (true); // if success then return true
		} catch (Exception e) {
			System.out.println("Error!");
			return (false); // if fail then return false
		}
	}

	// 读取路径,copy
	public static int dealClass(String needfile, String sdir, String odir) throws IOException {
		int sn = 0; // 成功个数

		File usedclass = new File(needfile);
		if (usedclass.canRead()) {
			String line = null;
			LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(usedclass),
					"UTF-8"));
			while ((line = reader.readLine()) != null) {
				line = line.trim();
				int dirpos = line.lastIndexOf("/");
				if (dirpos > 0) {
					String dir = odir + line.substring(0, dirpos);
					File fdir = new File(dir);
					if (!fdir.exists())
						fdir.mkdirs();
					String sf = sdir + line + ".class";
					String of = odir + line + ".class";
					boolean copy_ok = copy(sf.trim(), of.trim());
					if (copy_ok)
						sn++;
					else {
						System.out.println(line);
					}

				}

			}
		}
		return sn;

	}

	public static void main(String[] args) {
		String needfile = "D:/greanjvm/rt_class.txt";//运行JAR生成的,应用程序所需类的txt文件
		String sdir = "D:/greanjvm/rt/"; //rt.jar解压后的目录
		String odir = "D:/greanjvm/rt1/";//抽取的类存放目录
		try {
			int sn = dealClass(needfile, sdir, odir);
			System.out.print(sn);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

 

所需的类都抽取到rt1目录之后,把原rt目录中的“META-INF”文件夹拷贝到rt1下面,进入rt1目录,用rar压缩工具打包成rt.zip,改名为rt.jar,然后替换jre6/lib目录下的rt.jar。

 

charsets1目录处理同上。

 

所需类的精简工作已经完成,接下来精简其他的。

 

1、Jre目录下的license都删除,只留bin和lib目录

2、bin下的执行文件需要运行jar时用DLL_Killer工具查看使用到了哪些文件

3、lib下只要保留 rt,charsets库就可以了(因为应用程序只用到了这两个)。

4、除了i386和zi两个子目录外,其余的子目录都可以不要(原则上都要自己试试看删除其他目录会不会报错)。

5、Zi下只需要保留自己地区的子目录和其下的一些文件就可以(这里Zi下我只保留了America文件夹)。

6、Lib下除了库之外的属性文件都要保留。

 

优化完成!!!!!!!!!!!

 

 

注意事项:

1、精简BIN目录
  *运行JAR包时需指定PATH路径,不然会默认搜索环境变量中的JDK路径。
  *用DLL_Killer工具查看任务管理器中java.exe调用的DLL库

2、精简LIB目录
  *抽取出的类重新打包成rt.jar时要注意,用JAR命令和rar工具打的jar包都不行。解决如下:
 -将原生的rt.jar用rar打开,然后进入相关目录,删除掉相关目录或者文件,再把抽取出来的类拖进来就行了。
  *zi文件夹下只留America文件夹

 

BIN目录

 

 

lib目录

 

JVM目录

 

 

哥的整个测试目录

 

 

精简后JRE接近7M

  • 大小: 64.9 KB
  • 大小: 126.9 KB
  • 大小: 44 KB
  • 大小: 76.2 KB
  • 大小: 107 KB
分享到:
评论

相关推荐

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

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

    JDK8精简版 单独JRE运行环境

    自己开发的java程序要在别人电脑上运行吧!但是给别人电脑装完整jdk是不是太“重”了呢?这个单独提取的jre可以帮你。Windows上运行可以创建bat放jre当前目录:@echo off %cd%\jre\bin\java.exe -jar %cd%\xxx.jar

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

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

    linux jdk1.7 64位 jre jdk

    linux版本 jdk1.7 64位 jre jdk linux版本 jdk1.7 64位 jre jdk

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

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

    exe4j+精简jre实例

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

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

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

    根据jdk1.7.0._45精简出来的jre

    根据jdk1.7.0._45精简出来的jre,可用于rcp 打包运行中

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

    自己动手精简我们jre,再打包成exe这样java程序就可以在windows下很好的运行了,而且jre体积也很小不影响下载!感兴趣的可以下载后动手精简一下你的jre,我的精简到了2M以内,做成exe后根本看不出来是java做的。里面...

    精简 jre 效果程序

    精简 jre 效果 程序

    精简的jre和精简过程

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

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

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

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

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

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

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

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

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

    精简的jre,及精简工具

    精简了jdk1.6的jre 精简工具是GreenJVMMake.jar 下载后GreenJVMMake.jar不用解压,直接使用(将它与您的程序.jar放在同一个文件夹内) 使用方法javaw -jar GreenJVMMake.jar -t da -i ./myapp.jar -o ./ 就可生成rt....

    JRE与JDK的区别

    开始接触Java的时候觉得Java虚拟机很麻烦,不明白JRE与JDK的区别是什么?后来搞清楚JRE是个运行环境,JDK是个开发环境。

    JRE瘦身手动精减达到10MB

    我在网上下载了许多精减JRE的方法,反复学习折腾了几天,结果jre无法运行,后来我干脆全部用手动精减JRE,边删除边动行我自己制作的软件,结果现在可以精减到15.1MB的大小,比以前的80MB还是要小得多。

    精简版本jre

    精简版jre

    Jre8精简基础镜像包

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

Global site tag (gtag.js) - Google Analytics