java C/S架构的客户端自动更新实现

前言:

用java开发的客户端,还在不断开发完善中,客户有几十个时,如果挨个通知下载更新,就太麻烦了,于是实现了一个更新功能,以节省更新的人力物力。

实现思路:

  1. 从服务器获取最新版本号,和当前版本判断,从而判断出是否需要更新
  2. 从服务器下载最新版本的jar文件到临时文件夹(所有java代码,包含更新的这一段,都导出为可执行的jar)
  3. 关闭当前程序,复制临时文件夹的新版本覆盖运行目录文件,启动程序(笔者最开始担心这个,敲黑板!,下面这句是重点)
第3点在实现时有疑虑,经过试验得知可行:因为Runtime.getRuntime().exec("windows运行命令");不阻塞,既执行到此句后可继续往后运行,以便关闭当前程序,完成覆盖重启

实现过程:

1. 在服务器端保存版本号:

在http服务器上用json文件存放最新版本信息: version.json

{
	"version":2.0,
	"desc":"1.引入自动跟新功能。
2. 提高通讯效率。
3. 修复若干bug。",
	"date":"2018-8-8 22:00:00"
}

2. 在服务器上存放最新版本程序:

因为程序包含 exe外壳,程序核心jar文件和jre运行环境,每次更新全部下载一遍很浪费服务器资源,我们仅仅在http服务器存放jar文件,并且打包exe时不把jar文件包含进去,仅仅用于调用 jre/bin/java.exe执行jar文件。 要实现上述运行方式,推荐一个软件,可以方便的把bat脚本打包成exe,来启动jar,可以实现不弹出cmd窗口,管理员权限运行,软件图标,运行目录等

3. 客户端实现下载和重启:

4. 更新脚本 update.bat

@echo off 
  if "%1" == "h" goto begin 
  mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit 
  :begin 
  
@ping 127.0.0.1 -n 4 & mv .	mpdowloadtmp  .sourceMain.jar & .启动软件.exe
前面那一段用于让控制台窗口在程序启动后消失 @ping 127.0.0.1 -n 4用于粗略延时4秒,避免开始复制时 Main.jar没有运行结束

------------ 分割线 ----------------- 2018年8月21日更新: 上述的更新脚本: mv命令在win10上可以运行,但是到了win7/xp上就不管用了,所以换用xcopy /s/e/y,而且我的项目关闭不需要4s,所以重启延时改为1秒,即脚本改为:

@echo off 
  if "%1" == "h" goto begin 
  mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit 
  :begin 
  
@ping 127.0.0.1 -n 1 & xcopy /s/e/y .	mpdowloadtmp  .sourceMain.jar & .启动软件.exe
这里问的人也比较多,请注意你们的路径,尽可能使用相对路径

------------分割线结束-------------

5. 其他的补充说明:

1. 上文提到的,使用把启动jar程序的bat转化为exe可执行程序,转化的bat代码如下
.jreinjavaw.exe -jar .sourceMain.jar
2. 弹窗展示版本示例

一个简单的弹窗就不贴代码了

关于怎么做java程序的外壳,方便的开发java程序的界面,可以参考笔者的这篇博客 https://blog..net/sinat_34820292/article/details/80808126

经验分享 程序员 微信小程序 职场和发展