看了官方的demo,还是研究了好久才实现了此功能。描述实在是太简单了。
参考地址:fxldemo fxlauncher JavaFX本地应用自动更新功能的实现——FXLauncher
在看了那些参考资料后,感觉还是无从下手。资料上说主要是以下几个步骤:
1)编译项目JAR到app.dir
2)复制依赖包到app.dir
3)生成app.xml manifest
4)创建本地安装器
5)上传artifact到自动更新仓库
实现该功能后,回过头来看官方给的步骤就比较好理解了。其实步骤中最关键的地方就是 生成app.xml manifest 。
只要能搞定app.xml和理解fxlauncher是个什么东东就好办了。
下面是我的具体步骤:
(就是该javafx要实现自动更新功能。可以参考例子fxldemo)。
此时项目应该是一个可以编译运行的应用了,只是没有自动更新功能。现在就是要在此基础上实现该功能。
MyBrowser项目是按照javafx入门教程创建的,项目项目和运行使用的是ant,和fxldemo使用的maven不一样,所以需要根据fxldemo中的pom.xml修改对应的build.xml。
先把修改后的build.xml文件贴出来:
主要修改的地方:
① default="do-deploy" 改为了 default="create-app-xml"。
② 添加了一个新的target,即
③ 前面定义create-app-xml任务需要的相关参数。
④ 在项目的lib目录下添加fxlauncher.jar包。
其中相关参数说明:
${app.url} : 就是app.xml中的 http://10.100.1.240:8089/,该参数是必须的
${mainClass}:application.Main,这个是我们javafx项目的入口类。即我们项目运行时main方法所在的类。该参数是必须的
${app.dir}: F:\eclipseworkJavaFX\MyBrowser\build\dist,这个是fxlauncher要遍历的文件目录,fxlauncher会遍历该目录下所有文件然后在app.xml中添加相应的记录(根据配置的--include-extensions=Java,dll,properties,所以遍历时只把*.java,*.dll,*.propertiers类型文件添加到app.xml中)。该参数是必须的
${app.cacheDir}: USERLIB/MyBrowser, 这个非必须。
${app.acceptDowngrade}: 例子上写的是false,具体有什么用还没研究。 这个非必须。
${app.parameters}: --myOption=myValue --myOtherOption=myOtherValue ,这个非必须。
fxllauncher.jar工具提供了一个CreateManifest类。该类输入相关参数可以创建app.xml。
fxlauncher.CreateManifest 大概需要了解的暂时这些就够了。
理解app.xml是做什么的很重要。
Updating...
-fx-font-weight: bold;
-fx-pref-width: 200;
-fx-spacing: 10; -fx-padding: 25;
--myOption=myValue --myOtherOption=myOtherValue
USERLIB/MyBrowser
true
false
Application 标签
ts属性:这个是该app.xml文件生成的时间long值。fxlauncher判断是否需要远程同步本地的app.xml。当远程服务器(即自动更新仓库)上的app.xml中ts如果比本地的要大,则远程下载app.xml到本地。具体本地所在位置即cacheDir配置中的位置,我的是H:\Users\Pelin\AppData\Local\MyBrowser\application.Main.xml
uri属性:远程服务器访问地址。
launch属性:本地应用MyBrowser的入口类mainClass。
lib标签
file属性:和前面的uri组合成文件下载地址,从改地址下载文件后覆盖或者新增到本地,从而实现本地应用的更新。如:
http://10.100.1.240:8089/config/config.properties http://10.100.1.240:8089/MyBrowser.jar 等
所以要实现本地应用自动更新,以上地址必须能正常下载文件才行(这个自动更新仓库项目部署之后再说)
checksum和size属性:size属性容易理解,就是文件的大小,checksum 我没仔细看,但是fxlauncher会根据这2个属性判断本地对应的文件是否是最新的,如果不是则会从服务器下载最新的。需要注意的是:这个和前面的ts比较后,同步app.xml没有关系,即使app.xml不需要更新,但是这2个参数和本地文件不匹配的话也会去服务器上同步更新的。比如手动改了app.xml文件中的size属性,导致其和本地的文件不一致,fxlauncher会每次启动都去服务器中同步,所以一般不要手动修改lib标签的checksum和size属性。
cacheDir标签
该标签下的路径表示的是fxlauncher从远程服务器上下载文件后所存放的位置。USERLIB通过fxlauncher的解析,在win 7下真正目录为:
H:\Users\Pelin\AppData\Local
H表示是的操作系统盘。我的操作系统在H盘,所以是H,如果操作系统在C盘,那下载后的文件应该是放到了C盘。
前面都搞定了,接下来就比较简单了。
fxldemo中使用了maven的插件功能,配置了app.xml文件压缩到jar中。我运行demo时提示报错,说可能和我的系统不兼容,总是压缩不成功。我的是win7 32位系统。不知道是因为win7和linux系统的原因还是32位和64位系统的原因。研究了2个小时,没搞定,先不管了。
简单粗暴的解决办法:直接手动使用winRAR打开方式打开jar,然后把app.xml文件拖入jar。
反正就是操作一次,以后发布时不用再次压缩,就是一次操作,别整那么复杂了。
这个简单弄了下,先测试通过就行。
服务器ip:10.100.1.240。然后在该服务器上配置tomcate 8,其端口号改为8089。如果使用默认8080的话,那前面的配置对应改为8080.生成的app.xml中uri也是使用8080.
总之tomcate启动端口和app.xml中uri中的端口一致就好。
我的项目build.xml中配置编译后程序目录在${basedir}\dist 即 F:\eclipseworkJavaFX\MyBrowser\build\dist。
把该目录下所有文件都拷贝到服务器上的%tomcate_home%webapps/root目录下。(%tomcate_home%表示tomcate安装目录)
现在可以发布你的应用程序了,只要把压缩了app.xml的fxlauncher.jar发布,用户下载fxlauncher.jar后运行会自动下载程序到本地。下载完成后会自动启动应用。
下面是启动后界面:
编译运行项目。即使用ant运行build.xml。将dist目录下所有文件拷贝到tomcate的root目录下,相同文件也覆盖。
这样用户再次打开之前的fxlauncher.jar就会自动更新本地应用了。大功告成!!
这样本地应用自动更新功能就实现了。这个应该适应所有的jar程序吧,不一定非得javafx。fxlauncher只是根据app.xml下载更新文件,并根据mainClass启动程序。