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