通常你的应用程序的startup窗口只是一个bridge窗口,它将会与app server进行通常通讯,通过比对client已安装的文件库的版本(你可以在client安装时生成一个ini文件来记录各个库的版本,在server side也有一个对应的文件,当需要更新时改这个文件),从而产生需要下载更新和文件列表, 根据例表,bridge窗口会启动socket或http连接来下载指定文件overwrite本地文件,在全部OK之后,bridge窗口再启动应用的主程序并关闭自已,完成在线升级.
所以关键是要有一个bridge窗口,它通常是一个启动图版窗口,它与你的主程序从某种意上来讲是两个不同的app,这样保证在升级中不会产生不能读写本地文件导致的问题,也会保证有些应用一加载时就会加载所有的库文件导致的问题.
你需要有一个Server,我们可以用Http Server来处理,也就是说你的Client App 在安装的时候需要指定你更新服务器在什么地方,例如:http://update.mycom.com/xapp/upgrade
其中你在xapp webapp中通过设定/upgrade为一个servlet,他将支持Get Http请求,它将会反回一个xml,这个xml中包含所有可升级包(通常可能是.class文件或.xml或.jar等,总之是你client中需要更新文件)的最新版本号,例如:
<xapp>
<pack location="lib" path="comm1.jar" version="1"/>
<pack location="lib" path="comm2.jar" version="2"/>
<pack location="classes" path="com/xapp/util/FileUtil.class" version="1"/>
<pack location="classes" path="com/xapp/dtd/module.dtd" version="1"/>
<pack location="config" path="useraction.xml" version="3"/>
..............
</xapp>
然后,你需要在你的Http Server上开发另外一个servlet用于下载指定的资源,例如:
http://update.mycom.com/xapp/download?location=lib&path=comm2.jar
将会下载client app安装目录下lib子目录下的comm2.jar,当然,需要在你的update.mycom.com xapp下某个地方例如web-inf/update/下,存放最新的发布程序(安装好的).
OK, 有了上面支持外,你需要做的工作就在client app了, 你需要两个main method的java应用, 一个是你目前的main method class,即真正运行的启动的class,我们将它定义为App Main Class, 你需另外开发一个带main method的class,它用于检查版本并下载更新后的文件,并同步本机的版本信息,最后启动App Main Class, 我们定义它为Launcher App Class.
例如:
public class AppLauncher {
public static void main(String[] args) {
1. 通过http://update.mycom.com/xapp/upgrade读取server上应用版本信息
2.
if (本地没有版本信息文件,) { //说明我们初次安装
下载 server上返回的版本配置中所有的文件(配置xml文件中有location信息及path信息)
}
else {
下载server上返回的版本高于本地配置文件中版本的包
}
3. 利用server上返回的xml替代本地的xml
4. 调用commandline启动App Main class method.(注意不要在程序中直接运行,而是通过commandline方式来运行,这样就相当于没有Launcher App Main class了).
5. 当启动完App main class之后,Launcher App就自动退出了.
}
}
注意一点:
1. Launcher App的classpath不要同 App Main应用合一块了,也就是说他们是完全独立的.
2. 从某种意义上来讲,你首次安装的Client App只是Launcher App,没有安装App Main及其相关的任何组件.