经过一年时间断断续续的开发,终于能够对“Java应用定制工厂”这个项目Release了。
Java应用定制工厂(以下简称为JCB,Java Customization Builder)是一个针对Java轻量级桌面应用进行精简优化的小工具,使用它可以精简你的jar包,并自动生成一个精简的JRE,也可以使用它生成一个Exe启动引导程序,并且能够对你的Java应用自动做Pack200和Unpack200处理。使用本工具定制的Java桌面应用通常不会超过10M(包含JRE),SWT客户端程序相对于Swing客户端程序更小,一般不会超过5M。
精简JRE网上已经有很多文章了,但是实际操作上却有一个严重的弊端,很容易抛出
NoClassDefDoundErr , 这个Error基本上是致命的,一旦发生,Java程序就会崩溃。通常产生这种Error是由于Verbose模式下运行没有考虑到的异常状况导致的,所以Verbose模式得到的结果十分的不可靠,需要对其作进一步的加工。JCB的处理手段是针对Verbose结果进行反编译处理,找出这些class文件的依赖关系,并将这些被依赖的类也做打包处理,这样就能杜绝95%以上的
NoClassDefDoundErr错误。这里需要考虑的是Java的类动态加载机制,通过这种机制加载的类只能用Verbose模式获得,SWT中没有使用这种方式加载class,但是Swing,JDBC,XML框架,Eclipse框架等一些结构比较巧妙的框架中则大量运用了动态加载,所以如果你确认你的代码中包含了这些框架,那么你就老老实实把基本功能都跑一遍吧。
得到了Java应用程序需要的class文件之后,就需要对JRE进行精简的处理。JCB会对常用的一些Class作分析,判断那些dll库是必须的,一般来说轻量级的Java应用,JCB完全能做到自动处理,JCB并没有处理重量级Java应用的机制,比如RMI之类。不过JVM一般都会对缺少的库做出提示,你也可以根据这些提示将缺少的dll添加到精简后的JRE中。
现在Java应用的Jar包和JRE都被精简了,下一步就是生成可以执行的exe文件了,大家常用的软件是exe4j,不过JCB提供了一些比exe4j更强大的功能。JCB生成的exe可以把外部参数通过exe传递给Java应用,这样你就可以制作一个关联扩展名的Java应用程序了。JCB还可以针对Java应用做Pack200处理,Pack200能够极大的压缩jar文件,为什么JRE安装包只有16M左右,而一个rt.jar都有40多M,原因就在于此。JCB是通过Au3脚本来生成exe文件的,你也可以自己修改JCB生成的Au3脚本,定制你自己需要的行为。
默认情况下JCB生成的exe会首先读取注册表,寻找符合条件的JRE,优先级是JDK>JRE>自带JRE,如果一个都没找到,会弹出提示对话框。
JCB下载地址:
http://sourceforge.net/projects/jcb/files/JCB_1.0.0.zip/downloadPS:JCB本身就是一个JCB生成的Java应用程序。:)