最近做項目時使用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地址地址
