整理JRE瘦身或精简JRE

Java开发JRE7下载及安装指南 JRE7中新增的安全功能有助于开发人员构建更加安全的应用程序。一些主要的新功能包括:更好的密码策略支持:为密码学API提供了新的框架,使得密码策略的实现更加灵活。证书撤销检查:引入了OCSP(在线证书状态协议)支持,增强了对证书撤销状态的检查。JRE7官方文档的结构通常分为几个主要部分,包括:概述: 介绍了JRE7的基本概念、特性和安装要求。用户指南: 详细说明了如何安装、配置和使用JRE7。开发者手册。 阅读详情

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

/*
@author jarg
@TODO 举例查看当前程序必需的dll文件
*/
import java.io.InputStreamReader;
import java.io.IOException;

public class Hello
{
	public static void main(String[] args) throws IOException
	{
		InputStreamReader ir = new InputStreamReader(System.in);
		System.out.println("Hello");
		ir.read();
	}
}
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程序时所加载的所有类,如:

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

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

java/lang/Object
java/io/Serializable
java/lang/Comparable
java/lang/CharSequence
java/lang/String
java/lang/reflect/GenericDeclaration
.......


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

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

public class CopyClass
{
	private String source = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\";		// 类源目录
	private String dest = "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\";		// 类拷贝目的目录
	String[] jarArr = new String[]{"rt","charsets"};
	/***
	 * 
	 * @param source 类源目录
	 * @param dest   类拷贝目的目录
	 * @param jarArr 需要的提取的jar文件
	 */
	public CopyClass(String source,String dest,String[] jarArr){
		this.source=source;
		this.dest=dest;
		this.jarArr=jarArr;
	}

	public static void main(String[] args)
	{
		String[] jarArr = new String[]{"rt","charsets"};
		CopyClass obj = new CopyClass("C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\",
                                                         "C:\\Users\\lzp\\Desktop\\printSoft\\jre6\\lib\\",jarArr);
		obj.readAndCopy("C:\\Users\\lzp\\Desktop\\printSoft\\class.txt");
	}

	/***
	 * @param logName 提取class明细
	 */
	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);
	}

	/***
	 * 从原jar路径提取相应的类到目标路径,如将java/lang/CharSequence类从rt目录提取到rt1目录
	 * @param string 提取类的全路径
	 * @return
	 * @throws IOException
	 */
	public boolean copyClass(String string) throws IOException
	{
		String classDir = string.substring(0,string.lastIndexOf("/"));
		String className = string.substring(string.lastIndexOf("/")+1,string.length()) + ".class";
		
		boolean result =false;
		
		for(String jar : jarArr){
			File srcFile = new File(source + "/"+jar+"/" + classDir + "/" + className);
			if(!srcFile.exists())
			{
				continue;
			}
			
			byte buf[] = new byte[256];
			FileInputStream fin = new FileInputStream(srcFile);

			/* 目标目录不存在,创建 */
			File destDir = new File(dest + "/"+jar+"1/" + 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();
			result = true;
			break;
		}
		return result;
	}
}
然后在将提取的class文件打包成jar文件,利用jar命令进行打包,然后替换以前的jar文件,这样lib就从以前的六十多M到几M多有,如图:



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





Java运行环境JRE 7.0的安装与配置 Java Runtime Environment(JRE)是Java平台的一部分,它包括Java虚拟机(JVM),Java类库以及其他运行Java应用程序所需的文件。它是Java程序执行的环境,允许开发者在不同平台上运行Java程序。Java Development Kit(JDK)是用于开发Java应用程序的软件开发包,包含JRE及编译器(javac)、调试器和其他工具。 阅读详情

相关推荐

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

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

windows GUI 版JRE瘦身工具

win-finestJREjre精简实现的窗口wingdows 应用,它能够轻松的令java虚拟机尽可能最大瘦身。 1、去除虚拟机中不被程序调用的类。 2、压缩虚拟机体积,减少空间占用。 3、操作 点选 配置 ->设置 好相关环境参数并确定后,开始实行监控调用的类.关闭测试程序会自动化生成所有的JRE中的jar包到本地程序根目录的 out 处 保证简单易用

瘦身后的jre

这个是jre是经过我自己处理的一个缩小版jre瘦身后大小约为3M; 目前我自己在window平台的xp和win7下测试时没什么问题,下载后我在压缩包里面写了一个简单的bat文件,jre测试.bat,下载后,如果能够正常运行这个bat文件,则说明你机器上可以使用改jre,因为我也不是每台电脑上都试过,只在四五天机器上测试过,我测试的机器上是都可以正常运行。但我测试的java代码里面并没有使用java的图形化界面。 如果有问题可以联系我,可以给我留言

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

前不久给朋友做了一个桌面程序,程序文件没多大,但运行java程序需要jre,但jre足足有80M多,然后在网上搜了如何给给JRE瘦身精简JRE整理如下:打开JRE安装目录.目录包括bin,lib二个文件夹,所以就是将这两个文件进行瘦身了,1. bin: 可以认为这是Java虚拟机.2. lib: 执行class文件时,Java虚拟机需要用到的类库及资源文件.一、bin瘦身主要从两方面考虑① e...

weixin_39981681的博客 1228

精简jre,及精简工具

请不要下载,有些问题,有的程序无法使用。 精简了jdk1.6的jre 精简工具是GreenJVMMake.jar 下载后GreenJVMMake.jar不用解压,直接使用(将它与您的程序.jar放在同一个文件夹内) 使用方法javaw -jar GreenJVMMake.jar -t da -i ./myapp.jar -o ./ 就可生成rt.jar。用它覆盖掉jre\lib\rt.jar 如果还不行就使用java -jar myapp.jar查看问题

jre精简工具(附详细教程).

工具+教程,让你轻而易举的精简属于你自己的jre!

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

因为很多用户的电脑上没有合适版本的jre。用一个软件的同时必须安装另外一个软件(jre)会给人一种流氓软件强行捆绑的感觉,而很多用户对此很抵触。更不要提用户电脑上的jre版本千变万化(有没有jre,是微软的还是sun的,是1.4还是1.6),与其大费周章强迫其安装你的软件所需要的版本,不如省心点把jre内置在产品里算了。 当然内置jre就牵扯到jre的大小问题,一个5m的软件内置一个10多m的jre……也许硬盘不在乎,但是对下载时间的影响还是非常明显的,软件下载的时候,用户的耐心是很有限的,所以越小越好。 至于证书的问题,连android都能发布~!无论你修改过的jre多么不符合java规范,只要你不把它叫成是java,那就不会有人管你~ -----------引用Nighthaven

java 7 安装_Java7详细安装使用技巧教程

从此站点下载jre7(Java环境)程序包,然后双击运行Exe程序。进入jre7安装界面,可以直接按界面右下角的安装按钮进行快速安装,将软件安装在默认的C盘目录下。单击左下角的“更改目标文件夹”选项以自定义JRE安装路径。三、进行常规设置后,我们将介绍jre7安装界面,但是如果您有其他阻止jre7安装的程序(Java运行时环境),则会出现以下屏幕,此时,您只需单击关闭程序并继续按钮即可。 。四、输...

weixin_29592699的博客 3104

精简jre

可能会遇到这样的情况: 写一个Java程序,然后交付别人使用,但别人的机器上不一定安装了jre(也就是Java 运行环境) 处理: 交付程序的时候同时交付一份jre 再次发现的问题是jre体积太大: 我写的程序,例如程序导出的jar者再将jar包转成的.exe程序,体积并不大,但jre的体积却很大。 例如:我的其他内容不到30M,但我用到的jre竟然有150M+。 处理: 精简...

yangc_cong的博客 1709

JRE瘦身 & 制作小工具

目的:此前操作人员一直是用excel中的函数来进行一个业务数据的计算,由于此法操作不太方便,故应项目经理要求,用java写一个小工具,算法现成,只要能实现即可,于是写了一个html格式的,一个基于swing的exe文件,此文主要讲exe文件集成的jre瘦身。 但由于使用者的电脑环境中并未配置jre环境,所以我们在导出的exe文件中需集成jre,现在的我使用的jre1.8大小已经超过200...

u013287852的博客 2527
上一篇: oracle常见的异常
下一篇: Hadoop分布式安装
xiaoping8411
博客等级 码龄19年 147粉丝 203原创
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值