由于个人兴趣,一直喜欢用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,这下小工具可以方便的共享了。
注:本文中提到的工具类为自己实现的文件操作的工具类。