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

精简jre(JDK6瘦身)

阅读更多

参考文章:

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脚本方便测试:

Js代码  收藏代码
  1. @echo off  
  2. set path=./jre6/bin  
  3. java -jar -verbose:class test.jar >>class.txt  
  4. pause  

 

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

Js代码  收藏代码
  1. [Opened D:\data\dict\jre\lib\rt.jar]  
  2. [Loaded java.lang.Object from D:\data\dict\jre\lib\rt.jar]  
  3. [Loaded java.io.Serializable from D:\data\dict\jre\lib\rt.jar]  
  4. [Loaded java.lang.Comparable from D:\data\dict\jre\lib\rt.jar]  
  5. [Loaded java.lang.CharSequence from D:\data\dict\jre\lib\rt.jar]  
  6. [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代码  收藏代码
  1. java/lang/Object  
  2. java/io/Serializable  
  3. java/lang/Comparable  
  4. java/lang/CharSequence  
  5. java/lang/String   

 

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

charsets.txt

Java代码  收藏代码
  1. sun/nio/cs/ext/ExtendedCharsets   
  2. sun/nio/cs/ext/GBK   
  3. sun/nio/cs/ext/DoubleByteDecoder   
  4. sun/nio/cs/ext/GBK$Decoder   
  5. sun/nio/cs/ext/DoubleByteEncoder   
  6. sun/nio/cs/ext/GBK$Encoder   

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

 

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

 

代码如下:

Java代码  收藏代码
  1. package com.ccic.greenjvm;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.io.LineNumberReader;  
  9.   
  10. public class ReduceRt {  
  11.     // 文件拷贝  
  12.     public static boolean copy(String file1, String file2) {  
  13.         try // must try and catch,otherwide will compile error  
  14.         {  
  15.             // instance the File as file_in and file_out  
  16.             java.io.File file_in = new java.io.File(file1);  
  17.             java.io.File file_out = new java.io.File(file2);  
  18.             FileInputStream in1 = new FileInputStream(file_in);  
  19.             FileOutputStream out1 = new FileOutputStream(file_out);  
  20.             byte[] bytes = new byte[1024];  
  21.             int c;  
  22.             while ((c = in1.read(bytes)) != -1)  
  23.                 out1.write(bytes, 0, c);  
  24.             in1.close();  
  25.             out1.close();  
  26.             return (true); // if success then return true  
  27.         } catch (Exception e) {  
  28.             System.out.println("Error!");  
  29.             return (false); // if fail then return false  
  30.         }  
  31.     }  
  32.   
  33.     // 读取路径,copy  
  34.     public static int dealClass(String needfile, String sdir, String odir) throws IOException {  
  35.         int sn = 0; // 成功个数  
  36.   
  37.         File usedclass = new File(needfile);  
  38.         if (usedclass.canRead()) {  
  39.             String line = null;  
  40.             LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(usedclass),  
  41.                     "UTF-8"));  
  42.             while ((line = reader.readLine()) != null) {  
  43.                 line = line.trim();  
  44.                 int dirpos = line.lastIndexOf("/");  
  45.                 if (dirpos > 0) {  
  46.                     String dir = odir + line.substring(0, dirpos);  
  47.                     File fdir = new File(dir);  
  48.                     if (!fdir.exists())  
  49.                         fdir.mkdirs();  
  50.                     String sf = sdir + line + ".class";  
  51.                     String of = odir + line + ".class";  
  52.                     boolean copy_ok = copy(sf.trim(), of.trim());  
  53.                     if (copy_ok)  
  54.                         sn++;  
  55.                     else {  
  56.                         System.out.println(line);  
  57.                     }  
  58.   
  59.                 }  
  60.   
  61.             }  
  62.         }  
  63.         return sn;  
  64.   
  65.     }  
  66.   
  67.     public static void main(String[] args) {  
  68.         String needfile = "D:/greanjvm/rt_class.txt";//运行JAR生成的,应用程序所需类的txt文件  
  69.         String sdir = "D:/greanjvm/rt/"; //rt.jar解压后的目录  
  70.         String odir = "D:/greanjvm/rt1/";//抽取的类存放目录  
  71.         try {  
  72.             int sn = dealClass(needfile, sdir, odir);  
  73.             System.out.print(sn);  
  74.         } catch (IOException e) {  
  75.             e.printStackTrace();  
  76.         }  
  77.   
  78.     }  
  79. }  

 

所需的类都抽取到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

分享到:
评论

相关推荐

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

    精简JRE通常涉及以下步骤: 1. **选择精简工具**: - 工具如`jlink`是Java 9及更高版本自带的命令行工具,用于创建定制的运行时图像。它允许用户选择需要的模块并生成自定义的JRE。 - `jpackage`是Java 14引入的...

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

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

    精简的jre,及精简工具

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

    64位jdk1.8 精简版 体积非常小 解压后小于100M

    在这个场景中,我们讨论的是一个针对64位操作系统的精简版JDK 1.8,其特点是体积小巧,解压后不超过100MB,相较于原版的360MB有了显著的瘦身。 JDK 1.8,也被称为Java 8,是Oracle公司发布的一个重要版本。它引入了...

    精简版JRE7 64位 (6MB)

    标题提到的是一个精简版的JRE7 64位版本,其大小仅为6MB,相较于原始的JDK(大约127MB)大大减小了体积,这主要是通过去除不必要的组件和优化资源实现的。 JRE7是Java 7版本的运行时环境,发布于2011年,它引入了...

    精简版JRE.rar

    "精简版JRE"的主要特点在于针对特定应用场景进行了瘦身,去除了不常用或者不必要的组件,例如: - 删除了某些特定平台的本地库,以减少跨平台的体积。 - 精简了部分高级特性,如JavaFX,对于不需要这些功能的简单...

    关于jre瘦身

    这通常涉及到精简JRE,去除不必要的组件和库,以减少总体安装体积。在本文中,我们将探讨如何进行JRE瘦身,以及这一过程涉及的关键知识点。 1. **Java运行时环境 (JRE)** JRE是Java开发工具包(JDK)的一部分,...

    把java生成独立的程序,不用安装jdk也可使用

    尽管SUN(现Oracle)已经有瘦身版JRE的计划,但在特定场景下,自定义精简JRE仍然是一种有效的解决方案。需要注意的是,精简JRE时必须确保不影响程序的正常运行,所有必要的类库和组件都应保留。 总的来说,通过`exe...

    jdk1.8.0_121.tar.gz

    3. JRE瘦身:Oracle在1.8.0_121版本中进一步精简了JRE(Java运行环境),移除了不必要的库,减少了安装包的大小,降低了维护成本。 4. 集成更新:JDK 1.8.0_121集成了最新的OpenJFX库,使得JavaFX在该版本中得到更...

    MiniJre制作小工具

    迷你JRE制作小工具是一种实用程序,专门设计用于创建精简版的Java运行时环境(JRE)。在传统的Java应用程序部署中,JRE通常占据较大的磁盘空间,这对于某些应用场景,比如嵌入式设备或者对存储空间有严格限制的环境...

    官方原版 ejdk-8u161-linux-i586.tar.gz

    总的来说,ejdk-8u161-linux-i586.tar.gz是一个面向Linux 32位系统的轻量级Java开发工具包,它的核心优势在于通过多种profile实现了JRE的瘦身和精简,使得在资源有限的环境下也能高效地运行Java程序。对于那些需要在...

    java+swing打包jar成exe.pdf

    可以通过精简JRE来减少体积,例如移除不必要的文件和库,只保留必需的部分。例如,可以删除license文件,仅保留bin目录下的java.exe或javaw.exe,lib下的rt, jsse, jce, charsets库等。这种方法需要仔细分析和测试,...

Global site tag (gtag.js) - Google Analytics