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

来源:互联网 发布:js 720度全景 编辑:程序博客网 时间:2024/06/05 10:10

我们最近做了一个单机版的桌面应用系统,由于特殊的原因,我们使用了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");
然后这个事到这就算完了,不知道对大家有没有用~
最后,感谢挑剔的客户,他们促进了我们技术的进步~

0 0