JavaFx 軟體重啟功能實現

one發表於2022-01-28

原文地址: JavaFx 軟體重啟功能實現 | Stars-One的雜貨小窩

本篇使用Kotlin在TornadoFx中實踐,沒有Java程式碼的示例,各位自行參考,思路已在本文中提及

實現思路

主要思路為,使用命令列執行java命令,重新開啟jar包,同時關閉當前的jar包

但如何知道當前jar包位置?

前面這一篇Kotlin/Java 讀取Jar檔案裡的指定檔案 | Stars-One的雜貨小窩也有所講解到,我們可以獲得jar包中的具體的檔案

但是上一篇寫的前提是,已知到一個jar包檔案的目錄,但目前我們不會知道使用者把jar包放在何處,所以就不明確jar包的位置

但是也有方法,我們在jar包使用個資原始檔,之後根據此資原始檔即可定位到路徑

在jar包如果獲取resources的資源,可以得到下面的一個url字串 jar:file:/D:/project/javafx/lanzou-downloader/out/test.jar!/desc.json

對其進行字串處理,即可得到當前jar包檔案位置

Kotlin實現

Kotlin主要是在TornadoFx的環境寫的,用了TornadoFx相關的工具方法

當然,由於沒使用linux系統測試過,下面存在有未實踐過的程式碼,請各位知悉

java.exe和javaw.exe區別:

java主要是命令列使用,而javaw,則是對應java應用程式(有UI)

原始碼

/**
 * 獲取當前jar包的檔案路徑
 *
 * @param url 在View中使用resources.url("")獲取的引數
 * @return
 */
fun getCurrentJarPath(url: URL): File {
    val filePath = url.path.substringBeforeLast("!/")
    return File(URI.create(filePath))
}

/**
 * 重啟當前應用
 *
 * @param url 在View中使用resources.url("")獲取的引數
 */
fun restartApp(url: URL) {
    val jarFile = getCurrentJarPath(url)
    //開啟新應用
    Runtime.getRuntime().exec("cmd.exe /c javaw -jar ${jarFile.path}")
    //關閉當前應用
    Platform.exit()
}

/**
 * 開啟指定jar檔案
 *
 * @param jarFile
 */
fun openApp(jarFile: File) {
    if (jarFile.extension.toLowerCase() == "jar") {
        if (isWin()) {
            Runtime.getRuntime().exec("cmd.exe /c javaw -jar ${jarFile.path}")
        } else {//linux或mac(未實踐過)
            Runtime.getRuntime().exec("javaw -jar ${jarFile.path}")
        }
    }
}

/**
 * 當前系統是否為window系統
 */
fun isWin(): Boolean {
    val prop = System.getProperties()

    val os = prop.getProperty("os.name")
    return os.contains("win", true)
}

使用的話,只需要在VIew的按鈕點選事件對應處呼叫方法即可

button("測試") {
    action{
        restartApp(resources.url("/desc.json"))
    }
}

確保你的resources資料夾,有desc.json檔案(或者是其他檔案)

PS:後續會收錄到common-controls的庫中

相關文章