假如开发完了一个RCP应用程序,要安装到客户端,那么这个安装文件会有多大呢,我们当然希望是越小越好。
我们先算一下普通方式下的文件大小:
jre1.5 安装程序 16M
rcp3.2 runtime 9M
rcp应用程序(包含用到的第三方的lib) 此处假设 2-3M
那么将这些文件打成包后的大小将为28M左右,一个普通的rcp安装程序居然会有这么大。这实在有点令人难以接受。
难道就不能再小一点吗?我们多么希望有一个小巧的RCP安装程序啊。答案是肯定的,我们完全可以将RCP安装程序控制在10M以内,甚至更小。
此处只介绍如何压制一个最小的RCP压缩包,至于如何制作安装程序,已经超出了讨论的范畴,只要有了最小的压缩包,不论用何种安装程序,都可以制作出10M以下的RCP安装程序。
第一步: jre 减肥
jre1.5安装程序有16M,这可是一个大东西,客户想要运行RCP程序,首先就要安装JRE.这也是很多客户反感的,jre里面包含了太多的东西,很多是rcp程序根本用不到的,比如swing库,假如全是用swt开发,swing包就多此一举了。 而且JRE的安装程序也不见的那么健壮,笔者就曾经两次碰到在不同的机器上不能成功安装jre的情况,而且通过添加删除程序也删不掉,非常烦人。其实完全没有必要安装JRE,只需要在rcp安装目录下建一个jre目录,里面包含jre用到的文件就可以了。rcp程序启动时,会首先查找当前目录下有没有jre目录,假如有,就用里面的jre,假如没有才去注册表查找jre.接下来,我们看看这个jre目录里面都有哪些东西,一些不要的统统删掉,至于删掉哪些,要根据情况而定,这个需要反复实验才能确定哪些有用,哪些没用。最后bin目录笔者保留了必须的dll和exe文件,llib目录里面,只保留了rt.jar和charsets.jar这两个库。但是rt.jar还是太大了32M,既然要减肥,那就彻底减到底吧,用WinRAR或者其他解压缩工具打开rt.jar,看看哪些包里面的class不需要,就统统删掉。例如,客户端不需要swing,Javax.swing包干掉,客户端不需要rmi,javax.rmi包干掉,删来删去,最后rt.jar变成了10多M, charsets.jar这个包也挺大8M,里面包含了不同的字符集编码,其实很多字符集都用不到,根据情况挑选你所用的吧。
到了这一步,jre已经瘦了一圈了,但还是不能达到我们的目的,假如用普通的压缩工具压缩jre目录后,基本可以达到10到12多M.这离我们的目标还差好大一快呢。jre还的减肥,这次狠一点,拿出我们的杀手武器pack200,pack200是java1.5自带的(在jre\bin\目录下)一个针对class文件进行压缩的工具,由于专门针对class文件进行了优化,压缩比高的惊人(当然速度也比普通压缩软件慢多了)pack200的用法请自行参考相关文档。先用pack200把rt.jar,和charsets.jar压缩一下,然后用其他压缩软件对jre整个目录压缩一下,压缩后的大小让你吃惊,假如用rar,压缩出来的是4M,zip高一些4.8M.可能是笔者删的东西太多了,所以会这么小。但这里还包含一个8M的charsets.jar文件。笔者试过,假如不包括charset.jar,用rar压缩后大小为2.88M,这实在太惊人了,有谁能想象一个只有2.88M的JRE,遗憾的是charset.jar是必须的,你可以删掉里面一些不要的字符集这样能压出来的jre也再3M-4M之间。必须注重的是,解压缩的时候,还要用pack200解开压缩后的jar文件。整个步骤就是压缩两遍,第一遍用pack200压缩所有的jar文件,第二遍再用一个其他压缩软件压缩jre目录。这样就能得到一个很小的jre压缩包。
看到这里,有人开始怀疑,这个3M多的JRE能用吗?笔者就曾将这个jre放到eclipse目录下,eclipse启动一切正常,进去后可以继续写我的java代码,还可以编译java文件(其实eclispe本身不需要tools.jar,它自己就带了一个很强的java编译器),从cvs下载文件也不成问题,试了一圈,没发现有什么出错的地方。当然,包不齐,少了那个class文件,就会出错了,所以删除class文件的时候,尽量不要多删。假如你很熟悉每个class文件的用途,就可以放心的去删了。假如SUN能出一个 MINI JRE 那就更好了。
第二步: RCP插件减肥
记不清从eclipse3.1起的那个版本,已经开始支持将插件打包成一个jar文件,甚至这个插件里面包含着其他的jar文件,这在3.1以前只能创建一个插件目录。既然插件可以打包成jar文件,那么pack200就派上用场了,同压缩jre一样,此处就不在叙述了。
值的注重的问题是,有的插件jar文件里面包含一个目录lib,lib里面又包含了其他的jar文件,那么用pack200对这个插件jar压缩的时候,lib里面的jar文件是不会压缩的。这个也不是什么问题,只要写个小程序,对lib里面的jar文件压缩一下就行了。