您的位置:首页 > 编程语言 > Java开发

如何优雅的包装java写的桌面应用程序给客户

2015-07-20 22:23 351 查看
我们最近做了一个单机版的桌面应用系统,由于特殊的原因,我们使用了java语言开发了这个系统。当可运行的jar包打好的那个时刻我们自然是非常激动的,然而问题来了~

我们的客户是十分典型的普通大众,要如何提供给他们我们的软件呢?

我们的主旨思想就是大家都用惯了windows的应用,所以我们必需使得这款应用执行起来像个exe。而且用法和普通的软件一样。

1.打包。

以eclipse为例,选择要打包的项目,右键export,然后选择Runnable JAR file(可运行的jar文件)。点击以后会需要给项目选择一个主类(java可以包含N多个main函数,所以必须指明将哪个作为最开始运行的类。)

需要的jar包都要打进去。



成功的话会生成一个xxx.jar文件(通过cmd命令 javaw -jar xxx.jar 可以成功运行)

2.快捷方式调用

其实就是设法调用上面那个测试命令。但是问题又来了~首先,你得有个jre~客户的电脑上装没装jre是未知的,而告知客户安装jre也不太好,于是我们选择的是把jre也作为了程序的一部分。即把jre和xxx.jar放在同一个文件夹下,然后,我们选择用windows都能执行的vbs脚本来调用上面的命令,脚本内容如下,假如叫start.vbs:

Set shell=wscript.createObject("wscript.shell")
a=shell.Run("start ./jre/bin/javaw.exe -jar xxx.jar",0)


题外话:为什么不用bat?因为始终没解决弹出黑框的问题!

然后,我们的目标就是安装的时候在桌面生成这个vbs的快捷方式(快捷方式的图标也要换)!

3.打包安装

这里用到一个打包软件,我们使用的是Smart Install Maker,它可以将一个文件夹下的所有内容打成安装包,并且支持生成某个文件的快捷方式(指定图标),也支持生成卸载程序,具体的使用细节可以百度。需要打包的内容主要有:



然后让安装程序自动生成start.vbs的快捷方式在桌面,以及在开始菜单生成卸载程序等。这样整个流程就基本完成了。但是不久我们就遇到了新的问题!

4.新的问题

上面用vbs调用的脚本方法挺好,不会弹出黑框,但是java有个硬伤,调用程序之前要先打开java虚拟机,这里当然可以在程序里想办法把它作为一个服务长期开着,但是本着不占用客户资源的想法,我们没那么做,而这样导致的问题是每次开机第一次运行的时候程序打开缓慢,点击了快捷方式没反应20多秒才能打开界面~于是~我们的客户就不干了~=_=||

我们的解决方案并不是提高启动速度,而是为程序追加一个引导界面,就像word一样先出个小框~但是~这个界面是不能用java写的~不然等于没写~所以我们用来VisualStudio的MFC写了一个显示图片的程序,但是这个程序并不知道什么时候java界面启动成功~所以我们在java程序界面初始化的时候杀死这个c++界面的进程~既然都用了c++于是也不用vbs脚本了,直接在c++里调用cmd运行jar就得了,整理一下顺序是这样的:

C++程序运行打开引导界面-〉调用javaw启动jar->java虚拟机和程序成功启动-〉java程序杀死C++程序的进程-〉java界面初始化

下面附上控制用的关键代码:

C++调用cmd不弹出黑框框~:

ShellExecute(NULL,NULL,”\”“绝对路径\javaw.exe\”“,” -jar \”绝对路径\exam.jar\”“,NULL,SW_SHOWDEFAULT );

这个函数不支持相对路径,所以要使用绝对路径,而且一定要在stdafx.h里面加上
#include <shlobj.h> #include <shellapi.h>
不然函数没反应~

java程序杀死某个进程:
Runtime.getRuntime().exec("taskkill /F /IM xxx.exe");


然后这个事到这就算完了,不知道对大家有没有用~

最后,感谢挑剔的客户,他们促进了我们技术的进步~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: