JavaFx 軟件重啓功能實現

原文地址: 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的庫中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章