最近做项目时使用javafx做客户端程序,那么不可避免的会遇到升级的问题。移动端都有在线升级的方案,那么对于桌面应用程序也要与时俱进啊,那么在这里就记录一下javafx的解决方案。在这里还是推荐一下github,这个程序员共享的代码网站只有你想不到,没有搜不到的项目。在这里可以推荐一下fxlauncher。那么在这里我尽可能的记录一下配置方法。
1.配置gradle依赖
1.1 配置说明
group 'no.tornado'
version '1.0'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'no.tornado:fxlauncher-gradle-plugin:1.0.20'
}
}
apply plugin: 'java'
apply plugin: 'no.tornado.fxlauncher'
fxlauncher {
applicationVendor 'My Company'
javapackagerOptions = [
'-BuserJvmOptions=-Xmx=128m',
'-BuserJvmOptions=-Xms=128m'
]
nativeLibraryPath 'src/main/resources/lib'
// Base URL where you will host the application artifacts
applicationUrl 'http://localhost:8088/common-service/config/download'
applicationMainClass 'com.joincloud365.desktop.cashier.CashierLaunch'
acceptDowngrade false
applicationTitle "cashier-app-$version"
whatsNew 'https://www.baidu.com'
// Optional scp target for application artifacts hosted at the above url
deployTarget 'root@xx.xx.xx.xx:/root/app/desktop-app'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
compile 'org.controlsfx:controlsfx:8.40.12'
}
在这里我着重说明一下核心配置:fxlauncher,这里面有几个重要的属性:
- applicationVendor:这个可以给应用程序起的名字
- javapackagerOptions:这个属性比较重要,其实这个gradle插件可以把桌面应用程序根据当前的操作系统打包成对应的安装文件,实际上它还是利用了javapackager命令, 这个属性可以配置相关的参数比如说,我这里就是配置了堆内存的大小,详细的大家可以参考javapackager
- nativeLibraryPath: 这个属性可以指定本地的类库文件夹,打包时会自动添加这些jar
- applicationUrl: 这个属性至关重要,在程序启动时回去远程地址加载对应的文件,如果第一次启动会去这个地址下载对应的jar与app.xml,如果这个配置不正确第一次启动会报无法找到类的错误
- whatsNew: 当fxlauncher发现有新的版本时,当程序启动会根据这个地址先弹出一个更新的版本说明,这个地址实际上是自己配的说明网页
- deployTarget:这个会使用scp命令将打包好的依赖项远程拷贝至服务器。applicationUrl配置的访问地址一定能读取到这个地址里的文件,并能够成功下载
1.2 任务说明
添加该插件后会有如下几个任务:
- copyAppDependencies: 拷贝当前的所有依赖包至打包环境,默认是build/fxlauncher目录
- generateApplicationManifest: 生成 app.xml 至 build/fxlauncher
- embedApplicationManifest: 将 app.xml 拷贝到 fxlauncher.jar
- deployApp: 使用scp命令将所有的依赖jar和app.xml拷贝到deployTarget配置的地址中
- generateNativeInstaller: 根据操作系统生成对应的安装文件
2. 后台提供下载代码
后台必须为gradle配置的applicationUrl提供相关的下载服务。简单的代码如下:
@SneakyThrows
@GetMapping(value = "/download/{file}", produces = {"application/x-download"})
public String download(@PathVariable("file") String file, HttpServletResponse response) {
response.addHeader("Content-Disposition", "attachment;filename=" + file);
byte[] content = FileUtil.readBytes(new File(appUpdaterPath + file));
response.getOutputStream().write(content);
response.flushBuffer();
return null;
}
注意这个地址必须和applicationUrl
里配置的保持一致,后面的路径变量{file}
必须提供,因为fxLauncher
启动的时候会去该地址下载或检查是否有更新的文件,例如它会根据app.xml里配置的依次访问此地址下载jar文件
3. 记录一下mac系统制作图标的过程
上述处理完成后,紧接着制作一下mac应用程序的图标,在这里还是有很多坑的
- 建立一个以xxx.iconset的文件夹,注意名字不要起错了
- 将一个选择好的png格式图片拷贝到上述文件夹当中
- 运行如下命令:
# 全部拷贝到命令行回车执行,执行结束之后去tmp.iconset查看十张图片是否生成好 sips -z 16 16 pic.png --out tmp.iconset/icon_16x16.png sips -z 32 32 pic.png --out tmp.iconset/icon_16x16@2x.png sips -z 32 32 pic.png --out tmp.iconset/icon_32x32.png sips -z 64 64 pic.png --out tmp.iconset/icon_32x32@2x.png sips -z 128 128 pic.png --out tmp.iconset/icon_128x128.png sips -z 256 256 pic.png --out tmp.iconset/icon_128x128@2x.png sips -z 256 256 pic.png --out tmp.iconset/icon_256x256.png sips -z 512 512 pic.png --out tmp.iconset/icon_256x256@2x.png sips -z 512 512 pic.png --out tmp.iconset/icon_512x512.png sips -z 1024 1024 pic.png --out tmp.iconset/icon_512x512@2x.png
这里面注意,png的命名格式icon_像素大小x像素大小.png ,这里像素大小有个规定必须是:con_16x16.png icon_16x16@2x.png icon_32x32.png icon_32x32@2x.png icon_128x128.png icon_128x128@2x.png icon_256x256.png icon_256x256@2x.png icon_512x512.png ,icon_512x512@2x.png这几种。比如说64x64的不支持,那么我们就必须这么命名它icon_32x32@2x.png,同理依次类推。
- 通过
iconutil
生成icns文件$ iconutil -c icns tmp.iconset
,此时你的目录应该有了你想要的
生成好图标就把该图标拷贝到对应的文件目录里,然后我们在gradle代码里做一下更改:
if (System.getProperty("os.name").toUpperCase().startsWith("WINDOWS")) {
javapackagerOptions.add( '-Bicon=/xxxxx/desktop-app.ico')
}else{
javapackagerOptions.add( '-Bicon=xxxxx/desktop-app.icns')
}
4.常见问题
- 启动时报ClassNotFoundException
遇到这个问题先确保gradle里配置的applicationUrl能不能下载对应的文件,如果下载不了或者配置地址无法访问就可能报这个错误 - 目前对springboot的支持的不是很友好,建议大家如果要用使用spring
- 项目的github地址地址