精简JRE过程
问题描述:
做了个java程序用exe4j打成exe包后,发现有些客户端没有JDK、JRE还是运行不了,让客户自己安装JRE感觉不太合适,JRE有七八十M直接打包进去也太臃肿,所以想着能不能精简出来一个能运行我的程序的精简JRE?
精简过程:
分析发现JRE中lib文件夹下的rt.jar文件占了整个JRE的大部分,70M的JRE1.6其中40M是rt.jar,所以精简JRE的主要任务在精简rt.jar,精简思路是找出rt.jar中我们要用到的class,把用不到的class删掉。
1.找出我们要用到的class
把jre中的bin和lib包复制到跟程序jar包同目录下,如图:
运行cmd命令行,cd到该jar包所在目录,设置环境路径,以我的实际情况为例:
set PATH=.;E:\EncryptSystem\bin
然后输出程序所有需要用到的class,使用如下命令:
java -jar -verbose:class EncryptSystem.jar >> classpath.txt
然后把程序的所有功能都使用一遍,尽量拿到一个尽可能全的classpath,得到的classpath.txt内容样式如下:
2.拿出这些class生成新的rt.jar
处理成这种方便使用的格式:
可以简单的用EXCEL的文本导入功能实现这种处理,然后再把“.”替换成“/”,后面加上.class就可以了:
把class处理成文件路径的格式是为了方便程序替换,我们还要写点简单的代码把rt.jar中我们要用到的这些class拿出来,毕竟就算只拿我们用到的class可能也有好几千个,手工去找还是很麻烦的。
代码内容就不贴了,大致处理思路是:1.手工先把rt.jar解压到rt文件夹里;2.程序遍历处理好的classpath.txt文件从rt文件夹中找到相应class文件;3.将找到的class文件复制到新文件夹rt_new下的相应路径[按classpath.txt中的路径创建好相应文件夹]下。
然后把rt_new压缩成rt.zip[注意不要把rt_new文件夹压缩进去,在rt_new文件夹下全选然后压缩就行了],重命名成rt.jar就可以了,这样我们就得到了精简版的rt.jar,我的rt.jar从40M精简到了大概4M。
用精简后的rt.jar替换掉lib中的原rt.jar,运行小程序,试一试全部的功能是不是能正常运行,如果发现报少class的错,从我们解压开的rt文件夹里找到那个class放到rt_new里相应目录下重新打包成rt.jar就可以了。windows下可以写个bat脚本运行我们的jar包,方便查看错误信息:
bin和lib里其他文件的精简就不用这么麻烦了,直接逐步删掉,程序不能运行再放回去。