西故山 > 太极 > 太极剑 > benbenming的个人空间

benbenming的个人空间

来源:网络转载 2014-09-02 20:30 编辑: 网络 查看:

由于个人兴趣,一直喜欢用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瘦身之前,先介绍一下我的开发环境,

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

    一、分析小工具所需类库

     

    加载库文件。注意,小工具的所有功能都需执行过,以保证小工具所需的所有类库都加载过。命令示例如下:

    @echo off

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

    pause

    [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]

    二、整理所需类库文件

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

    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

    的类库信息。

    java/lang/Object

    java/io/Serializable

    java/lang/Comparable

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

    三、准备JRE

    )。

    四、提取类库文件

    包中抽取小工具所需类库文件。这里保留了相关Jar中的非class文件,如属性文件等等。

    五、重新打包Jar

    六、精简JRE

    运行环境可完成小工具的所有功能。

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

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

    七、封装EXE

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

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