`

精简jre

    博客分类:
  • java
阅读更多

0. 思路:

    1)把自己的应用程序打包成可运行的jar包

    2)通过jar命令运行这个jar包

    3)把jar包所需要的类全部打印到文本文件中

    4)把上一步产生的类从文件中提取出来重新打包

    5)去掉jre中bin和lib目中下的不需要的文件和目录

 

1. 打包运行,使用下面bat将所用到的类全部输出到文件中

@echo off  
set path=.\jre\bin  
.\jre\bin\java -jar -verbose:class lottery.jar > class.txt
@pause

  

2. class.txt文件处理

    class.txt文件格式如下

[Opened D:\baiduyundownload\Lottery\jre\lib\rt.jar]
[Loaded java.lang.Object from D:\baiduyundownload\Lottery\jre\lib\rt.jar]
[Loaded java.io.Serializable from D:\baiduyundownload\Lottery\jre\lib\rt.jar]
[Loaded java.lang.Comparable from D:\baiduyundownload\Lottery\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from D:\baiduyundownload\Lottery\jre\lib\rt.jar]
[Loaded java.lang.String from D:\baiduyundownload\Lottery\jre\lib\rt.jar]

     这里使用到的是rt.jar和charsets.jar,将其分别抽取出来,抽取出来的格式如下:

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

    抽取步骤:

    

grep rt.jar class.txt > rt.txt
# 32位的jvm,使用rt.jar有下面这种格式
grep "from shared objects file" class.txt >> rt.txt


grep charsets class.txt > charsets.txt 

vi命令
%s/\[Loaded //g  # 替换掉行头
%s/ from *.*//g   # 替换掉行尾
%s/\./\//g            # .替换成/

 

3. 重新打包

1)首先将jre目录中的rt.jar, charsets.jar分别解压到输入目录,运行如下代码

    参数:./data/rt.txt ./data/rt ./output/rt

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

public class ReduceClasses {

	/**
	 * 文件拷贝
	 * 
	 * @param srcFileName
	 * @param destFileName
	 * @return
	 */
	public static boolean copy(String srcFileName, String destFileName) {
		try {
			FileInputStream in = new FileInputStream(new File(srcFileName));
			FileOutputStream out = new FileOutputStream(new File(destFileName));
			try {
				byte[] bytes = new byte[1024];
				int c = -1;
				while ((c = in.read(bytes)) != -1)
					out.write(bytes, 0, c);
				in.close();
				out.close();
			} finally {
				if (in != null) {
					in.close();
				}

				if (out != null) {
					out.close();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (false);
		}

		return (true);
	}

	/**
	 * 读取路径,copy
	 * 
	 * @param classFile
	 * @param srcRtDir
	 * @param destRtDir
	 * @return
	 * @throws IOException
	 */
	public static int dealClass(String classFile, String srcRtDir, String destRtDir) {
		int sucessCount = 0;

		try {
			LineNumberReader reader = new LineNumberReader(new FileReader(new File(classFile)));

			try {
				String line = null;
				while ((line = reader.readLine()) != null) {
					int pos = line.lastIndexOf("/");
					if (pos > 0) {
						File dir = new File(destRtDir + line.substring(0, pos));
						if (!dir.exists())
							dir.mkdirs();
						String srcFileName = srcRtDir + line + ".class";
						String destFileName = destRtDir + line + ".class";
						if (copy(srcFileName, destFileName))
							sucessCount++;
						else {
							System.out.println(line);
						}
					}
				}
			} finally {
				if (reader != null) {
					reader.close();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		return sucessCount;

	}

	public static void main(String[] args) {
		if (args == null || args.length != 3) {
			System.err.println("Usage: ReduceClasses classFile srcRtDir destRtDir");
		}

		String classFile = args[0]; // 运行JAR生成的,应用程序所需类的txt文件
		String srcRtDir = args[1]; // rt.jar解压后的目录
		String destRtDir = args[2]; // 抽取的类存放目录

		if (!srcRtDir.endsWith("/")) {
			srcRtDir += "/";
		}

		if (!destRtDir.endsWith("/")) {
			destRtDir += "/";
		}

		System.out.print("Success Count: " + dealClass(classFile, srcRtDir, destRtDir));

	}
}


     2)将原有rt目录中的META-INF拷贝到新的rt目录中去,进入新的rt目录,使用rar打成zip包,然后重命名为rt.jar.  charsets同样处理

 

4. 精简jre中其他无用文件

    1)新建jre目录,在其中建两个子目录bin和lib

    2)将新生成的rt.jar和charsets.jar拷贝到lib中

    3)从原生jre的lib中拷贝出i386和zi两个子目录,其中zi里面只保留America和Asia两个目录

    4)原生jre的lib中除了库文件和文件夹之外的所有属性文件都要拷贝到新的lib中

     5)在运行jar包时查看该进程使用到的dll,将这些dll保存到新的bin目录中去

 

5. 查看运行进程所用使用到的dll

     tasklist /m >dll.txt &&dll.txt

     java.exe    6376     ntdll.dll, kernel32.dll, KERNELBASE.dll,    

                                   ADVAPI32.dll, msvcrt.dll, sechost.dll,      

                                   RPCRT4.dll, jvm.dll, USER32.dll, GDI32.dll, 

                                   LPK.dll, USP10.dll, WINMM.dll, IMM32.DLL,   

                                   MSCTF.dll, verify.dll, java.dll, PSAPI.DLL, 

                                   zip.dll, swt-win32-3659.dll, ole32.dll,     

                                   OLEAUT32.dll, comdlg32.dll, SHLWAPI.dll,    

                                   COMCTL32.dll, SHELL32.dll, WININET.dll,     

                                   urlmon.dll, CRYPT32.dll, MSASN1.dll,        

                                   iertutil.dll, uxtheme.dll,                  

                                   QvodExtend_x64.dll, VERSION.dll,            

                                   WS2_32.dll, NSI.dll, dwmapi.dll,            

                                   CRYPTBASE.dll, CLBCatQ.DLL           

6. 结果:

我的jre中:

    bin |

          ---

              client |

                        --- jvm.dll

              java.dll

              java.exe

              verify.dll

              zip.dll

 

精简完的jre是4M多

 

7. 参考文章

http://yaojialing.iteye.com/blog/1067409

 

分享到:
评论

相关推荐

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

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

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

    标题 "精简JRE - 实例Swing计算器 with 精简JRE" 提供了两个主要知识点:一是关于Java的精简版运行时环境(JRE),另一个是使用Swing构建的计算器应用。 1. **精简JRE**: Java运行时环境(JRE)是执行Java应用...

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

    精简JRE的主要目的是减少安装包的大小,提高下载和部署的效率,同时降低运行时的内存占用。在JRE中,rt.jar是最核心的库文件,包含了Java标准类库的所有类。通过对rt.jar进行精简,可以移除那些不常用或者特定应用...

    exe4j+精简jre实例

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

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

    在IT领域,特别是Java开发中,经常需要将应用程序...总结,将Java应用程序转化为exe并精简JRE,既方便了用户,也优化了软件性能。通过使用恰当的工具和方法,可以实现这一目标,同时需要注意各种技术细节和合规问题。

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

    然而,标准的JRE安装包相对较大,对于某些只需要特定功能的应用场景,如服务器部署、嵌入式系统或者物联网设备,精简JRE可以有效地减小资源占用,提高运行效率。本篇文章将深入探讨如何精简JRE中的"lib"目录,以满足...

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

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

    精简 jre 效果程序

    - **定制需求**:某些应用可能只需要特定的Java功能,精简JRE可以只包含这些必要的部分。 - **安全性**:减少不必要的组件可以降低潜在的安全风险。 3. **精简方法**: - **选择性安装**:通过定制安装,仅安装...

    精简Jre和Jsmooth

    "精简JRE"通常指的是为了减少安装体积、提高运行速度或者针对特定应用需求而定制的JRE版本。这种定制化的过程可能包括移除不必要或冗余的库、插件和服务,使得JRE更加轻量化,适用于那些对系统资源有限制或有特定...

    精简jre最新版

    "精简jre最新版"指的是针对Java运行环境的一个轻量级版本,这个版本进行了优化,删除了一些不必要的组件,以减小安装包的大小。在描述中提到,它支持Swing组件,这意味着用户依然可以使用Java的图形用户界面(GUI)...

    精简jre的利器autojar

    【标题】"精简jre的利器autojar"所涉及的知识点主要集中在Java应用程序的部署和优化上。Autojar是一款非常实用的工具,主要用于自动化Java应用程序的打包过程,特别是对于那些需要精简JRE(Java运行环境)的项目,它...

    精简Jre 的方案网站

    精简JRE(Java Runtime Environment)方案主要针对的是在特定应用环境下对标准JRE进行裁剪,以减小其体积、提升启动速度或减少资源占用等目的。这种做法尤其适用于嵌入式系统、移动设备或其他资源受限的环境。本文将...

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

    因此,“精简JRE”成为了一个优化和减小JRE体积的有效方法。本篇将详细介绍如何精简JRE中的“bin”目录,以适应特定需求。 “bin”目录是JRE的核心部分,包含了Java虚拟机(JVM)、Java命令行工具和其他必要的可...

    精简的jre和精简过程

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

    精简JRE - verbose命令

    本篇内容将深入探讨如何精简JRE并使用verbose命令来获取运行时的详细信息。 首先,精简JRE是为了减小Java运行环境的体积,以适应不同的应用场景,例如嵌入式设备、物联网设备或云服务等。精简JRE通常包括删除不必要...

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

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

    Greenjvm_make 精简JRE

    【标题】"Greenjvm_make 精简JRE"是一个专为Java开发人员设计的工具,用于定制和优化Java运行时环境(JRE)。它简化了从标准JRE中剔除不必要的库和组件的过程,使得JRE体积更小,更适合特定的应用场景,从而提高应用...

Global site tag (gtag.js) - Google Analytics