前不久给朋友做了一个桌面程序,程序文件没多大,但运行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的瘦身!
相关推荐
因为很多用户的电脑上没有合适版本的jre。用一个软件的同时必须安装另外一个软件(jre)会给人一种流氓软件强行捆绑的感觉,而很多用户对此很抵触。更不要提用户电脑上的jre版本千变万化(有没有jre,是微软的还是...
在进行JRE瘦身时,需要谨慎处理,确保所移除的组件不会影响程序的功能,并且要注意版权问题,避免违反Oracle或OpenJDK的许可协议。同时,也要关注安全性和兼容性,确保瘦身后的JRE依然能够安全稳定地运行应用程序。
精简了jdk1.6的jre 精简工具是GreenJVMMake.jar 下载后GreenJVMMake.jar不用解压,直接使用(将它与您的程序.jar放在同一个文件夹内) 使用方法javaw -jar GreenJVMMake.jar -t da -i ./myapp.jar -o ./ 就可生成rt....
最近在写一个java开发的游戏,jre1.8.0_181整整有199mb,对于一个只有400多k的游戏来说,完全没必要,于是就进行精简,把jre精简到22.5mb,游戏也能正常运行。如果你急需使用精简的jre,可以下载试试。本来想精简到...
精简版JRE8虽然瘦身,但仍然能够支持这些新特性,确保开发者可以使用最新技术的同时,享受更高效的运行环境。 至于压缩包子文件的文件名称列表"jre8精简",这可能是压缩包的名字,其中包含了精简后的JRE8的安装文件...
自己动手精简我们jre,再打包成exe这样java程序就可以在windows下很好的运行了,而且jre体积也很小不影响下载!感兴趣的可以下载后动手精简一下你的jre,我的精简到了2M以内,做成exe后根本看不出来是java做的。里面...
精简JRE通常涉及以下步骤: 1. **选择精简工具**: - 工具如`jlink`是Java 9及更高版本自带的命令行工具,用于创建定制的运行时图像。它允许用户选择需要的模块并生成自定义的JRE。 - `jpackage`是Java 14引入的...
win-finestJRE 是jre精简实现的窗口wingdows 应用,它能够轻松的令java虚拟机尽可能最大瘦身。 1、去除虚拟机中不被程序调用的类。 2、压缩虚拟机体积,减少空间占用。 3、操作 点选 配置 ->设置 好相关...
通过以上步骤,我们可以了解到JRE瘦身的基本流程和技术,这对于系统优化和定制化部署有着重要的实践意义。不过,这种操作通常需要对Java虚拟机的工作原理有深入理解,以便在保证功能完整性的前提下,达到最佳的瘦身...
标题提到的"jre6精简版"是Java 6的一个轻量级版本,专门针对特定需求进行了优化和瘦身。这个版本在保持基本功能的同时,减小了安装包的体积,以便于快速下载和部署。 描述中提到"支持webservice",这意味着尽管是...
总的来说,"精简版JRE.rar"是一个适用于特定需求的优化JRE解决方案,特别适合那些希望降低应用程序或安装包体积的开发者。它能够帮助提高程序的分发效率,同时保持运行的基本功能,是一种实用的轻量化部署策略。在...
需要注意的是,虽然精简版JRE7降低了体积,但同时也可能无法支持某些需要完整JRE或特定模块的Java应用。因此,在选择使用精简版JRE时,应确保目标应用程序与这个轻量级环境兼容。此外,由于JRE7已经较旧,对于新的...
精简出最小_jre收藏 ,介绍了如何减少jre大小的方法。
标题中的“关于jre瘦身”指的是优化Java运行时环境(JRE)的大小,以便在有限的存储资源或特定性能需求下更有效地运行Java应用程序。这通常涉及到精简JRE,去除不必要的组件和库,以减少总体安装体积。在本文中,...
1. `make.bat`:如前所述,这是一个批处理脚本,用于执行JRE瘦身过程。 2. `fps_test.jar`:这是一个示例的Java应用程序,用于演示工具的使用方法。用户需要将其替换为自己的应用程序jar文件。 3. 可能还有其他辅助...
对jre包里的rt.jar精简,第一步:解压工具.rar,第二步:把你打包的jar小项目放到同一文件夹里。第三步:cmd,运行命令javaw -Dfile.encoding=utf-8 -jar GreenJVMMake.jar -t da -i ./mytest.jar -o ./ 执行后可以...
这个小工具就是为了解决这个问题,它能将JRE瘦身,使得应用程序可以携带更小的JRE进行运行,从而减少整体的文件大小,提高部署效率。 首先,我们来理解一下Java运行时环境。JRE是Java应用程序的基础,包含了Java...
5. **jre精简**:与“jre瘦身”类似,强调的是在保留基本功能的同时,移除了不必要的组件,以达到减小体积、提升性能的目的。 在压缩包的子文件中,"ejdk1.8.0_161"很可能是EJDK安装的主目录,包含了所有必要的组件...
3. **精简版**: 这个版本的JRE进行了瘦身,去除了非必要的组件,旨在减小安装体积,加快部署速度,同时降低系统资源占用。精简版可能不包含某些可选特性或工具,适合对内存和磁盘空间有限制的环境。 4. **Linux平台...
描述中提到,制作者花费了一周时间手动精简JRE,并且在自己的计算机上进行了测试,确保大多数功能可以正常运行。这表明该精简版JRE是经过精心优化和验证的,旨在提供一个轻量级的解决方案,适用于那些不需要完整JRE...