JavaFx 软件重启功能实现

Stars-one 2022年01月28日 298次浏览 本篇字数为2,013字

本文为作者原创,转载请注明出处,谢谢配合
作者:Stars-one
链接:https://stars-one.site/2022/01/28/javafx-restart-app


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