用java开发出来的程序,想给用户使用,直接给jar文件,用户没有jre,或者不会配java环境会造成诸多困扰。
于是就想把java打包的可执行jar包打包成exe可执行程序发布,网上理论很多,完整的流程介绍很少,本文介主要绍其过程。
java8的jre动辄100+M,项目中有大量的不需要使用的包,可以精简掉,笔者试过的有三种方法:
思路为精简jre的lib目录和bin目录,lib目录中的rt.jar很大,是简化jre的关键:
java -jar -verbose test.jar >> class.txt
,或者 java -XX:+TraceClassLoading MainTest >>class.txt
,就可以把用到的class名称路径输出到class.txt文件。jar xvf xxx.jar classname1 classname2 ....
就会把须要的class从jar中提取出来,拷贝到本地当前文件夹,这里的xxx.jar一般是从jre/lib目录拷贝出来的rt.jar
。jar cvf target.jar sourcefolder1 classfolder2 ...
对批处理脚本不熟悉,自创代码有错误,未解决暂补贴代码。思路是使用批处理里面的循环和正则处理字符串进行拷贝。使用java程序实现这一步比较容易,此部分不是本文重点,感兴趣请移步其他博主的文章:整理JRE瘦身或精简JRE。
精简jre是一个成熟并且难度比较低的操作,早已有成熟方案,GreenJVM便是其一,GreenJVM提供了精简jre和打包软件成exe的功能,这里主要介绍其精简jre/lib/rt.jar的过程。
- ib目录下一个运行Java程序不可或缺的文件是位于i386下的虚拟机配置文件jvm.cfg. 该配置文件用来管理不同版本的jvm.dll.其内容作为java.exe,javac.exe的全局变量,用来加载相应的动态链接库文件.
- lib目录里面除了包含程序运行所需要的类库及配置文件外,还包含有一些诸如: 鼠标光标,字体等系统资源.简单程序如果未用到这部分资源的话,可以剔除.
- lib\ext下不能全删除,保留这三个才能保证jar启动:
- 如果使用了swing,则lib\font下的字体不能全部删除,全删除会导致无法启动swing界面
- 因为项目使用了加密算法,lib\security不能全部删除,因为不太大,索性全部保留了
- lib下的jar只保留了ccharset和rt,大量配置文件不好判断,也不大,就不删了
最后效果如下图所示
效果很显著,jre8精简到原来的1/10体积
项目本来是放在谷歌开源上的,之前下载时发现2009年已经停止更新了,这里提供下载地址:
https://download.csdn.net/download/sinat_34820292/10539847
对于eclipse项目,右键导出成可执行jar文件,注意选择好主类。
在配置了JDK环境变量和path路径的前提下,把可执行jar放到这个文件夹,然后如下图修改批处理脚本make.bat,双击运行
java -jar GreenJVMMake.jar -t da -i ./你的可执行文件.jar -o ./
jar运行时尽可能多的操作,把所有功能运行一遍,使得工具可以导出尽可能完整的依赖,减小失败率。程序正常结束(比如不是通过任务管理器杀死的)后会在当前目录下生成一个rt.jar,体积会远远小于jre里面的那个几十兆的。
把jre整个目录拷贝出来,然后针对要运行的jar文件进行精简。步骤1.2.3也可以指定某个jre,把make.bat脚本里的java 改成 某个jre/bin目录下的java.exe即可。
如1.1.1所述方法,跟踪运行所需文件,删除不需要,网上有介绍使用360安全卫士跟踪的方案,因使用win10告别第三方杀毒软件已久,我用的别的小软件,dll_killer,还有使用CProcess,SRTask工具的,这里不提供下载地址,请自行搜索下载。
以使用dll_killer为例,把java程序运行时的pid填写进去,dll_killer会跟踪被加载的dll文件,从而可以知道哪些会用到,尝试删除掉没加载到的即可实现精简,(可怜的笔者尝试了一天才删除了没几个文件,想想最后精简失败,用了个完整jre6做出的安装包28M大小,没太大,就看开了)。
2018年7月17日补充: 在程序运行状态下,直接到jre的bin目录下全选删除,提示占用,删不掉的保留即可,亲测可行
JCB功能非常强大,好比前面的方法在用记事本编程序,那么这个相当于给了拟一个IDE。
已有博主做了详细的使用教程:
http://www.blogjava.net/cnfree/archive/2013/03/03/395999.html
本文不再赘述
步骤并不复杂,初次使用可能会失败,多尝试几次后发现挺好用,如果希望指定某个jre来运行,而不想受环境jre影响,需要如下这一步:
把一个jre包含进来,并且采用相对路径,删去自动使用系统java环境变量的搜索规则。
其中这一个可以用来实现开机自启动,但是我是通过后面的Inno Setup实现的自启动:
程序管理员权限可以在这一步添加,因为我的程序在win10下会无权写program file下的配置文件,所以赋予程序管理员权限:
使用Inno Setup可以创建安装包,实现管理员权限运行安装后的程序,实现开机自启动(经尝试修改注册表,把启动连接放到{userappdata}\Microsoft\Internet Explorer\Quick Launch目录可行),创建图标等操作,网上很多相关资料,很多程序都是使用这个工具做的安装包。需要请自行搜索资料。
#6. 实现单文件免安装程序
思路如下:类似于1.5,使用好压创建一个自解压exe文件,运行时静默把程序文件夹解压到系统缓存目录运行,实现免安装单文件程序效果。
Inno Setup用来创建安装包很方便,使用好压也不错,资料建议上网找,很丰富。
![这里写图片描述](https://img-blog.csdn.net/2018080811175756?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM0ODIwMjky/font/5a6L5L2T/fontsize/400/fill/I0JBQk
9月更新:
可以使用PowerBuilder开发基于java的客户端软件
11月更新
基于Eclipse RCP做开发,或者基于SWT开发,都是java比较好的图形化客户端方案,很多成熟java开发的项目,能看到他们的影子,如Hbuilder,Xmind (观察推测)
18年2月更新
补充一些Eclipse做java GUI开发的工具,参考:https://blog.csdn.net/appke846/article/details/79027112
Eclipse并不自带GUI的可视化开发工具,那么如果要在Eclipse进行可视化的GUI开发,就需要依靠第三方的插件。
Eclipse官方提供了一个叫做Visual Editor(VE)的开源GUI插件,功能还是比较强。可以根据用户的界面GUI设计,自动生成相应的JAVA代码。同样也可以通过相应的JAVA代码,生成其匹配的可视化GUI编辑界面。不过VE缺点比较大,我从3.1到3.2之前一直在用VE,没有多少改观。VE是通过另外启动一个JVM来模拟执行GUI的class,然后在Eclipse的界面内生成一个可视化效果。
VE使用起来问题很多,网上有网友直接评价说VE是“可用性不强”。
SWT-Designer是大家公认的,最强的Eclipse下开发GUI的插件http://www.swt-designer.com/。很多Eclipse书籍上都是直接拿SWT-Designer来讲解如何在Eclipse开发GUI界面程序。不过SWT-Designer是一个收费的插件。不收费的是基础版本,功能受到很大的限制。当然,网上也有完整版的破解版。SWT-Designer做得比较大,6.0最新的安装文件有几十M,可想其功能之强大。
jigloo严格意义上来说也是收费的,不过他提供了non_commercial的版本,而这个版本的功能和commercial是完全一样的http://www.cloudgarden.com/jigloo/。作为个人开发来说,是不受限制的。jigloo很小,最新的版本才3MB多,安装也比较简单。
jigloo也是完全基于Java代码的,不过它的code parse的能力远比VE要强,也要快。至少我很多在VE下出现问题,不能显示的Visual Class可以很好地在jigloo下编辑,至今还没有遇到jigloo不能编辑,parse出错的时候。而jigloo还可以集成了一写比较好的Java GUI风格代码的支持,功能上比VE要强大一些。
当然,3MB多的插件,再强也强不过SWT-Designer完整版的,但是比其基础版的要好很多。而SWT-Designer也并不是完全基于JAVA开发的,比如Windows版本的,还携带了dll文件。而jigloo是完全基于JAVA开发的,下载下来只有一个class的zip文件,也支持Eclipse的在线安装。
SWT Designer 即 WindowBuilder的安装
打开Eclipse 3.7 ,选择菜单栏help》 install new software。操作如图:
复制步骤一中的在线更新网址:
http://download.eclipse.org/windowbuilder/WB/release/R201309271200/3.7/
输入如图的标记处,enter下
新建Project 》other》SWT/JFACE JAVA PROJECT (或者其他的项目)
2019年3月30日更新:
Installshield,Windows installer XML是两个更好的windows安装打包软件
可以参考这篇文章:https://blog.csdn.net/catshitone/article/details/77802365
2019年7月15日更新:
可以参考下面这个地址:
https://blog.csdn.net/huwei2003/article/details/7020406