[JAVA]利用bat将jar转变成一个可执行文件exe

>本质

    明白话说在前头,其实这是一种掩耳盗铃的做法,不过在表现形式上,很像是把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窗口

     之所以要加上一个start 命令,原因在于:如果不加start命令,当我们运行这个bat之后,由于这个jar还处在运行状态,脚本"并不能执行"到exit这一行,于是一个又丑又黑的cmd控制台框就会横贯在桌面上而不会自动关闭,就很烦。而加上了start,实际上我们创建了一个窗口,在这个窗口中再执行javaw -jar myTest.jar——这一行的主要动作是创建新窗口,执行完后并不会关心这个窗口里在执行什么东西,于是脚本就走到了下一行的exit,最终该这个黑色的控制台窗口就会被自动干掉了。

     这一点在很多利用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.jartool.jar

那只要知道了这两点,我们在bat文件里手动指定一下也是ok的:

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,满世界撒丫子乱跑了。

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值