前段时间利用Java开发了一个GUI程序小项目(想要详细了解或获得项目的朋友可以在下方回复我),
开发的程序不大(才几M),而在用exe4j打包成exe时却要背着一个近200M的jre,因此开始了我的精简历程,下面我分享下我的一些小技巧和感想。
1.精简Jre实际过程可参考一下博文:https://my.oschina.net/haitaohu/blog/2243410 ;
2.精简bin过程可以采用删除法:首先用exe4j将jar(必须是可运行的jar文件)和jre打包生成相应的exe文件 —> 双击运行exe文件,然后打开bin目录Ctrl+A全选(除java.exe)删除,遇到不能删的点击跳过 —> 关闭exe文件,再次打开若能正常运行,即精简bin完毕;
3.精简lib中的rt.jar可能会用到GreenJVM,这里提供免翻墙下载地址。需要注意的是利用GreenJVM make工具精简出来的rt.jar的确很精简,但是会漏掉很多class导致后面运行不起来exe,也是后面exe4j打包后出现could not load main class问题的主要所在;GreenJVM make使用方法主要是利用记事本编辑下make.bat内容,不懂得可以回复我;
4.建议可以按照以上博文的步骤去试试,而我本人则是通过一种另一种笨方法来实现的:
(1)准备三个rt.jar和待执行的exe:一个是经GreenJVM精简后的rt.jar;一个是完整版的rt.jar;还有一个就是你要的rt.jar(你要做的rt,可以先复制一份完整的过来准备修改);以及将jar和你的jre打包后的exe;
(2)利用WinRAR分别打开三个jar文件,对照精简后的rt.jar(标记为rt_Simple.jar)相应的删除目标rt.jar(标记为rt_Target.jar)里的CLASS文件,然后进入运行exe,若运行成功不报错即没问题,继续下一批文件的操作;若报错或者报错,则打开完整版的rt.jar(标记为rt_Full.jar)找到相应的文件复制至rt_Target.jar里;以此循环,直到所有的(尽可能找大文件删除验证,到后面一些小文件可以忽略)删除完毕;
5.删除完所有的多余CLASS后用exe4j(点击可下载)进行打包exe,点开运行后若出现could not load main class问题,是利用GreenJVM make工具精简出来的rt.jar漏掉了很多class导致的,此时在exe同文件夹下会生成一个error.log文本,可以尝试着在该文本下找到缺失的CLASS名,在rt_Full.jar里找到相应的CLASS还原至rt_Target.jar里,继续运行exe,一般会再次出现问题,所以需要依次不断的找回CLASS;ps:有时候可能往rt.jar里面添加class文件也不能解决问题 那么就把相关的整个文件夹替换进去
6.全部CLASS文件都已经找回,打包完exe后,自己的电脑终于可以运行起来自己的项目了(有时程序不会用你自己的jre,即使你设置了相对路径,此时可以把电脑里的java环境变量随便改下致电脑的jre失效);
7.光自己的电脑成功了还不够,需要到其他电脑里测试才行,一测,果然还是出错了,又有好几个CLASS丢失,唉,为了解决这个问题我做了很多工作去解决,最后发现一切都是徒劳,因为:这样精简的jre对其他电脑系统的兼容性比较差,甚至不能运行,而解决方案就是在目标系统上运行一次,得到rt.jar整合所有用到的class文件;
8.后面的解决方案我已经无心去尝试了,对这个jre精简我已经琢磨一个多礼拜,煞费心血最后得了半成品:对于除了rt.jar包外进行了精简,而rt.jar依然原封不动打包进去,这样得到的jre虽然不是很精简,但确实是简化了一些;
在这里主要分享了自己这么长时间琢磨后的感受与小技巧,有什么问题可以直接回复我,我尽可能的回答大家。
希望对你有所帮助,欢迎订阅我的博客!