>本质
明白话说在前头,其实这是一种掩耳盗铃的做法,不过在表现形式上,很像是把jar变成了一个可执行的exe文件来运行。
jar的执行依旧是需要JRE环境的,但这个我们可以通过其他方式来实现,这里暂挂不表,我们留到最后去说。
转载请注明:[来自身披白袍的博客:http://blog.csdn.net/shenpibaipao]。
>运行前提
首先,要保证你的jar包双击之后能够运行,或是利用cmd控制台运行下面的命令后可以执行。
javaw -jar xxxx(你的jar包)有时候,双击可能并不能运行,但通过cmd控制台输入上面那个命令可以运行。这个主要是因为注册表和系统环境变量的问题,我会在另外一篇文章里说说这件事。
总之,最低的运行前提是,在cmd中输入以上命令可以执行。(当然,如果不行,看文末更一般的解决方法)
>编写bat
之所以选择利用bat,是因为它在dos和windows系统下都是标准的可执行文件,另外一个很重要的原因就是脚本编写简单。我们新建一个run.bat,右键txt打开,输入以下两行脚本命令,保存退出:
start javaw -jar myTest.jar exit我们很容易观察到javaw -jar myTest.jar实际上就是我们在cmd中测试过的执行jar的命令,这里只不过套了一层bat的批处理脚本去执行了这行命令并打开了jar文件。
这里有两个要点:
- start:启动一个窗口
- exit:此处作用是退出当前cmd窗口
这一点在很多利用bat启动jar的教程里都没有提到,算是一个小小的trick。
>编写可执行文件exe
随便打开一个C语言编译器,比如我用了大小为50MB的DevC++。Ctrl+New一个文件,输入以下内容:
#include <stdlib.h> int main(int argc, char** argv) { system("run.bat"); return 0; }没什么好说的,就是用系统命令去启动刚刚的那个run.bat文件,编译成exe即可。需要注意的是相对路径的问题。
*在我以上给出的代码中,jar、bat、exe文件都在同一个文件夹下。(很显然我写的都是同级相对路径,你们可以自己加上自己的相对路径)
需要注意的是,执行exe文件时可能会报缺失libgcc_s_dw2-1.dll。
可以到下面这个地址去下载,并放到同级目录下:
http://download.csdn.net/download/shenpibaipao/10142886
>运行测试
于是,我们现在点击执行exe文件,其真正执行过程会变成这样:
[exe]->[run.bat]->"javaw -jar myTest.jar"->[jar]
某种意义上就把jar伪装成了一个exe来执行。到这里,这个教程基本上就算完工了,很简单,自己就能完成,而不需要用到exe4j之类的软件。
>更一般的解决方法
在C语言中,完全可以通过system指令去执行shell或者dos,那么我们为什么要用bat呢?因为更方便修改。
配过java环境的人都知道这是一个多么麻烦的东西,不仅仅是环境变量,在windows系统下还需要考虑注册表的问题。像我在文章开头提到的:用cmd能执行jar当双击jar却无法执行就是一一个注册表的问题。其次,使用bat这种脚本文件更便于我们动态修改执行指令。因为exe一旦编译,就很难去修改了,除非重新编译一遍。
换句话说,这里的exe就相当于一个壳,一个把内部实现伪装过后的、对外部用户暴露的壳。
还有一个大麻烦,怎么解决JRE的问题?
其实也不难,我们都拿C#写过桌面应用,但实际上C#本身也是需要.net支持的,只不过微软帮我们搭配好了这个.net环境。
微软既然不能帮我们把JRE搭配好,那我们就手动来吧。拿JRE8举例,Oracle官方下载的压缩后的exe文件是70MB,实际安装完的大小是170MB,说大不大说小也不小。
首先,我们在我们要发布的的jar软件中都打包一份JRE文件。
当我们在执行javaw -jar xxxx 时,实际上我们用的都是这个JRE文件夹中的.\jre8\bin\javaw.exe。只不过在配好环境变量PATH的系统中,我们在cmd中直接输入javaw -jar xxx,系统会通过PATH给出的地址,去执行shell搜索相关的javaw.exe文件。
现在那么我们写批处理文件的时候,不默认通过shell去搜PATH地址下的javaw,而是自己给出它的地址(假设jre8文件夹与bat文件同级):
./jre8/bin javaw -jar (你的jar)但是这样还远远不够,这么写只是把javaw.exe给找到了而已,配置java系统环境变量的时候,别忘了还有一个CLASSPATH。
这个东西主要是在JVM启动的时候去做类加载的,简单来说就是给你的jar文件找运行库。其一般取值为:
.;%Java_Home%\bin;%Java_Home%\lib\dt.jar;%Java_Home%\lib\tools.jar其中%Java_Home%是jre8文件夹的绝对地址。其搜索了三个地方:
- .; 也就是当前目录下的所有jar文件;
- dt.jar和tool.jar
set Java_Home = ./jre8 start ./jre8/bin/javaw -classpath .;%Java_Home%/bin;%Java_Home%/lib/dt.jar;%Java_Home%/lib/tools.jar -jar myTest.jar exit
现在,只要带着jre8这个文件夹,你的jar就可以假装自己是一个exe,满世界撒丫子乱跑了。