本篇使用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的庫中