JAVA SE踩坑实践——可执行客户端打包, java打包成exe,jre精简,开机自启动,以管理员权限运行GreenJVMMake,JCB

版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/sinat_34820292 https://blog.csdn.net/sinat_34820292/article/details/80808126

用java开发出来的程序,想给用户使用,直接给jar文件,用户没有jre,或者不会配java环境会造成诸多困扰。
于是就想把java打包的可执行jar包打包成exe可执行程序发布,网上理论很多,完整的流程介绍很少,本文介主要绍其过程。

JRE8还是大很多的
JRE6小一些
jre6有93M,压缩后约25M。

1. 精简jre

java8的jre动辄100+M,项目中有大量的不需要使用的包,可以精简掉,笔者试过的有三种方法:

1.1 原始方法(原理):

1.1.1 精简思路:

思路为精简jre的lib目录和bin目录,lib目录中的rt.jar很大,是简化jre的关键:
1. 首先找到当前Java程序依赖的全部class,包含自身类库/第三方类库,以及JRE中的类库。
2. 将JRE中不须要的类库文件移除掉,仅仅保留须要的类库。
3. 将保留下的类库又一次打包。替换已有的JRE文件。
4. 监测运行时bin目录中用到的程序,删去不需要的(将在1.3介绍)。

1.1.2 精简jre 引用包过程


  1. 如何找到程序加载的class ?使用命令(前提是配置了java path环境变量): java -jar -verbose test.jar >> class.txt,或者 java -XX:+TraceClassLoading MainTest >>class.txt,就可以把用到的class名称路径输出到class.txt文件。
  2. 如何根据class名称复制出加载了的类?使用命令: jar xvf xxx.jar classname1 classname2 ....就会把须要的class从jar中提取出来,拷贝到本地当前文件夹,这里的xxx.jar一般是从jre/lib目录拷贝出来的rt.jar
  3. 将这些类库进行打包成jar ? 使用命令:jar cvf target.jar sourcefolder1 classfolder2 ...
    打包命令,将classfolder中的类库,打包为target.jar.
  4. 编写cmd脚本自动完成拷贝操作 :

对批处理脚本不熟悉,自创代码有错误,未解决暂补贴代码。思路是使用批处理里面的循环和正则处理字符串进行拷贝。使用java程序实现这一步比较容易,此部分不是本文重点,感兴趣请移步其他博主的文章: 整理JRE瘦身或精简JRE

1.2使用GreenJVM精简jre

精简jre是一个成熟并且难度比较低的操作,早已有成熟方案,GreenJVM便是其一,GreenJVM提供了精简jre和打包软件成exe的功能,这里主要介绍其精简jre/lib/rt.jar的过程。

  1. ib目录下一个运行Java程序不可或缺的文件是位于i386下的虚拟机配置文件jvm.cfg. 该配置文件用来管理不同版本的jvm.dll.其内容作为java.exe,javac.exe的全局变量,用来加载相应的动态链接库文件.
  2. lib目录里面除了包含程序运行所需要的类库及配置文件外,还包含有一些诸如: 鼠标光标,字体等系统资源.简单程序如果未用到这部分资源的话,可以剔除.
  3. lib\ext下不能全删除,保留这三个才能保证jar启动:
    这里写图片描述
  4. 如果使用了swing,则lib\font下的字体不能全部删除,全删除会导致无法启动swing界面
    这里写图片描述
  5. 因为项目使用了加密算法,lib\security不能全部删除,因为不太大,索性全部保留了
  6. lib下的jar只保留了ccharset和rt,大量配置文件不好判断,也不大,就不删了
    最后效果如下图所示
    这里写图片描述
    这里写图片描述
    效果很显著,jre8精简到原来的1/10体积
    这里写图片描述 这里写图片描述

1.2.1 下载GreeJVM

项目本来是放在谷歌开源上的,之前翻墙下载时发现2009年已经停止更新了,这里提供下载地址:
https://download.csdn.net/download/sinat_34820292/10539847

1.2.2 导出可执行的jar

对于eclipse项目,右键导出成可执行jar文件,注意选择好主类。
这里写图片描述
这里写图片描述

1.2.3使用greenJvm-make创建精简的rt.jar

在配置了JDK环境变量和path路径的前提下,把可执行jar放到这个文件夹,然后如下图修改批处理脚本make.bat,双击运行
这里写图片描述

java -jar GreenJVMMake.jar -t da -i ./你的可执行文件.jar -o ./

jar运行时尽可能多的操作,把所有功能运行一遍,使得工具可以导出尽可能完整的依赖,减小失败率。程序正常结束(比如不是通过任务管理器杀死的)后会在当前目录下生成一个rt.jar,体积会远远小于jre里面的那个几十兆的。

2.精简bin目录

把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目录下全选删除,提示占用,删不掉的保留即可,亲测可行


这里写图片描述

3. 使用JCB【JAVA应用定制工厂】

JCB功能非常强大,好比前面的方法在用记事本编程序,那么这个相当于给了拟一个IDE。
这里写图片描述
已有博主做了详细的使用教程:
http://www.blogjava.net/cnfree/archive/2013/03/03/395999.html
本文不再赘述

4. 对于一个jar和准备好的jre,使用exe4j封装

步骤并不复杂,初次使用可能会失败,多尝试几次后发现挺好用,如果希望指定某个jre来运行,而不想受环境jre影响,需要如下这一步:
把一个jre包含进来,并且采用相对路径,删去自动使用系统java环境变量的搜索规则。
这里写图片描述
其中这一个可以用来实现开机自启动,但是我是通过后面的Inno Setup实现的自启动:
这里写图片描述
程序管理员权限可以在这一步添加,因为我的程序在win10下会无权写program file下的配置文件,所以赋予程序管理员权限:这里写图片描述

5. 实现开机自动或者以管理员权限运行程序

使用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开发

猜你喜欢

转载自blog.csdn.net/sinat_34820292/article/details/80808126