现在的位置: 首页 > 综合 > 正文

精简出最小JRE

2014年03月21日 ⁄ 综合 ⁄ 共 4238字 ⁄ 字号 评论关闭

由于个人兴趣,一直喜欢用Java写一些客户端的小工具,而且对SWT更是有些偏好,所以一般使用Eclipse+WindowBuilder进行程序的开发。程序开发完了,自己用的话在Eclipse中执行就好了。有些小工具需要共享给其他兄弟用,就需要打个jar包了,如果那个兄弟没有装JRE,呵呵,那就需要拷贝一个百十来兆的JRE过去了,很是不方便,于是有了让JRE瘦身的想法。

当年的Sun是准备在未来的版本中加入精简版JRE的,现在的Oracle什么时候能推出呢?心里是个大问号了。

为了避免重复制造轮子(其实是想偷懒),于是在搜索引擎上搜寻了一番。结果不多,但还是有几个的。有的兄弟提供了一些想法和实践;有的兄弟直接提供了一个精简版的JRE--GreenJVM。

GreenJVM还是有一定名气的,很多兄弟都试用过。我也是兴冲冲的download的下来,按照说明精简了JRE中的rt.jar,然后把小工具的jar包拷贝到相应目录。不幸的是,我的jar包没有顺利的启动。GreenJVM也屏蔽了一些错误,所以并不知道小工具到底出了什么问题,提示了什么错误信息。

看来直接使用GreenJVM是不行了。只有自己给JRE瘦身了。

在给JRE瘦身之前,先介绍一下我的开发环境,

  • JDK版本为1.5

  • Eclipse版本为3.5

  • Java桌面应用的GUI使用SWT的组件库开发

  • Build Fat Jar插件将应用程序所需的类库打包至一个Jar

    我的JRE瘦身步骤是这样的。

    一、分析小工具所需类库

     

    使用批处理命令启动Jar格式的小工具,逐个执行其各个功能,批处理命令将其所加载的所有类库写入指定的文件--加载库文件。注意,小工具的所有功能都需执行过,以保证小工具所需的所有类库都加载过。命令示例如下:

    @echo off

    C:/bea9/jdk150_04/bin/java -jar -verbose:class SyncDB.jar >>dowithclass/class_syncdb.txt

    pause

    如示例,生成的class_syncdb.txt片段如下:

    [Loaded java.lang.ClassNotFoundException from C:\bea9\jdk150_04\jre\lib\rt.jar]

    [Loaded java.lang.LinkageError from C:\bea9\jdk150_04\jre\lib\rt.jar]

    [Loaded java.lang.NoClassDefFoundError from C:\bea9\jdk150_04\jre\lib\rt.jar]

    二、整理所需类库文件

    使用工具类ClassifyJar将加载库文件中的信息进行整理,按加载库文件中的信息所属的类库包进行分包整理,剔除多余信息,调整分隔符。

    如示例,将加载库文件分包整理后,生成文件如下:

    ⊃2;  class_syncdb_jre_rt.txt

    ⊃2;  class_syncdb_jre_charsets.txt

    ⊃2;  class_syncdb_jre_localedata.txt

    ⊃2;  class_syncdb_jre_other.txt

    ⊃2;  class_syncdb_app.txt

    其中文件名包含“jre”的文件与JRE相关,其中“rt”、“charsets”、“localdata”分别表示所属不同jar包,未包含入上述jar包的类库归入“other”,通过手工进行处理。文件名包含“app”为小工具所需的非JRE的类库信息。

    其中class_syncdb_jvm_rt.txt片段如下:

    java/lang/Object

    java/io/Serializable

    java/lang/Comparable

    我的小工具中使用到JRE的3个jar包。

    三、准备JRE

    拷贝Java运行环境(JRE),作为Java精简运行环境的基础(简称JRER)。

    解压缩小工具所需的Jar包(包含与JRE相关的Jar包)。

    四、提取类库文件

    使用工具类ReduceJar从已解压缩的所需Jar包中抽取小工具所需类库文件。这里保留了相关Jar中的非class文件,如属性文件等等。

    五、重新打包Jar

    使用工具类CreateJar将抽取出的类库文件打包为若干个Jar文件。

    

    六、精简JRE

    

    将与JRE相关的小工具Jar替换JRER中的相关文件,我的小工具共涉及3个。

    使用批处理方式以JRER为JRE运行小工具,并执行各个功能,逐个替换JRER中的dll等文件,确保最小的Java运行环境可完成小工具的所有功能。

    这个步骤最为繁琐,需要对JRER中的各个dll进行逐个剔除,在小工具的打包过程中也将SWT的4个dll封装入jar包,此时也进行剔除。

    

    上述六个步骤完成后JRE的瘦身也就完成了,我的小工具所需的JRE瘦身后仅为3.7M,小工具的jar包为2.26M,这样加起来也就是6M。

    

    七、封装EXE

    

    为了避免文件夹的拷贝,我用JSmooth将瘦身版的JRE和小工具jar包封装为一个EXE文件,封装后EXE文件为2.68M,这下小工具可以方便的共享了。

    

    注:本文中提到的工具类为自己实现的文件操作的工具类。

由于个人兴趣,一直喜欢用Java写一些客户端的小工具,而且对SWT更是有些偏好,所以一般使用Eclipse+WindowBuilder进行程序的开发。程序开发完了,自己用的话在Eclipse中执行就好了。有些小工具需要共享给其他兄弟用,就需要打个jar包了,如果那个兄弟没有装JRE,呵呵,那就需要拷贝一个百十来兆的JRE过去了,很是不方便,于是有了让JRE瘦身的想法。

当年的Sun是准备在未来的版本中加入精简版JRE的,现在的Oracle什么时候能推出呢?心里是个大问号了。

为了避免重复制造轮子(其实是想偷懒),于是在搜索引擎上搜寻了一番。结果不多,但还是有几个的。有的兄弟提供了一些想法和实践;有的兄弟直接提供了一个精简版的JRE--GreenJVM。

GreenJVM还是有一定名气的,很多兄弟都试用过。我也是兴冲冲的download的下来,按照说明精简了JRE中的rt.jar,然后把小工具的jar包拷贝到相应目录。不幸的是,我的jar包没有顺利的启动。GreenJVM也屏蔽了一些错误,所以并不知道小工具到底出了什么问题,提示了什么错误信息。

看来直接使用GreenJVM是不行了。只有自己给JRE瘦身了。

在给JRE瘦身之前,先介绍一下我的开发环境,

  • JDK版本为1.5

  • Eclipse版本为3.5

  • Java桌面应用的GUI使用SWT的组件库开发

  • Build Fat Jar插件将应用程序所需的类库打包至一个Jar

    我的JRE瘦身步骤是这样的。

    一、分析小工具所需类库

     

    使用批处理命令启动Jar格式的小工具,逐个执行其各个功能,批处理命令将其所加载的所有类库写入指定的文件--加载库文件。注意,小工具的所有功能都需执行过,以保证小工具所需的所有类库都加载过。命令示例如下:

    @echo off

    C:/bea9/jdk150_04/bin/java -jar -verbose:class SyncDB.jar >>dowithclass/class_syncdb.txt

    pause

    如示例,生成的class_syncdb.txt片段如下:

    [Loaded java.lang.ClassNotFoundException from C:\bea9\jdk150_04\jre\lib\rt.jar]

    [Loaded java.lang.LinkageError from C:\bea9\jdk150_04\jre\lib\rt.jar]

    [Loaded java.lang.NoClassDefFoundError from C:\bea9\jdk150_04\jre\lib\rt.jar]

    二、整理所需类库文件

    使用工具类ClassifyJar将加载库文件中的信息进行整理,按加载库文件中的信息所属的类库包进行分包整理,剔除多余信息,调整分隔符。

    如示例,将加载库文件分包整理后,生成文件如下:

    ⊃2;  class_syncdb_jre_rt.txt

    ⊃2;  class_syncdb_jre_charsets.txt

    ⊃2;  class_syncdb_jre_localedata.txt

    ⊃2;  class_syncdb_jre_other.txt

    ⊃2;  class_syncdb_app.txt

    其中文件名包含“jre”的文件与JRE相关,其中“rt”、“charsets”、“localdata”分别表示所属不同jar包,未包含入上述jar包的类库归入“other”,通过手工进行处理。文件名包含“app”为小工具所需的非JRE的类库信息。

    其中class_syncdb_jvm_rt.txt片段如下:

    java/lang/Object

    java/io/Serializable

    java/lang/Comparable

    我的小工具中使用到JRE的3个jar包。

    三、准备JRE

    拷贝Java运行环境(JRE),作为Java精简运行环境的基础(简称JRER)。

    解压缩小工具所需的Jar包(包含与JRE相关的Jar包)。

    四、提取类库文件

    使用工具类ReduceJar从已解压缩的所需Jar包中抽取小工具所需类库文件。这里保留了相关Jar中的非class文件,如属性文件等等。

    五、重新打包Jar

    使用工具类CreateJar将抽取出的类库文件打包为若干个Jar文件。

    

    六、精简JRE

    

    将与JRE相关的小工具Jar替换JRER中的相关文件,我的小工具共涉及3个。

    使用批处理方式以JRER为JRE运行小工具,并执行各个功能,逐个替换JRER中的dll等文件,确保最小的Java运行环境可完成小工具的所有功能。

    这个步骤最为繁琐,需要对JRER中的各个dll进行逐个剔除,在小工具的打包过程中也将SWT的4个dll封装入jar包,此时也进行剔除。

    

    上述六个步骤完成后JRE的瘦身也就完成了,我的小工具所需的JRE瘦身后仅为3.7M,小工具的jar包为2.26M,这样加起来也就是6M。

    

    七、封装EXE

    

    为了避免文件夹的拷贝,我用JSmooth将瘦身版的JRE和小工具jar包封装为一个EXE文件,封装后EXE文件为2.68M,这下小工具可以方便的共享了。

    

    注:本文中提到的工具类为自己实现的文件操作的工具类。

抱歉!评论已关闭.