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