JavaFx 软件重启功能实现
2023-02-18 16:38:35 时间
本篇使用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的库中
相关文章
- AST 初探深浅,代码还能这样玩?!
- 灵魂拷问,你真的了解DNS吗?
- 【R】getGEO运行报connection buffer错误
- 【科研热点】趋化因子/受体相关基因
- 组员老是忘记打卡,我开发了一款小工具,让全组三个月全勤!
- 让打卡小工具“智能一点”:添加请假过滤、token自动刷新
- React源码学习入门(六)React Component是如何实现的?
- R语言复杂网络分析各大电视台合播电视剧数量可视化
- React源码学习入门(七)详解ReactMount入口
- React源码学习入门(八)React组件挂载Component细节流程
- React源码学习入门(九)DOM挂载细节流程
- React源码学习入门(十)setState是怎么做到异步化的?
- React源码学习入门(十一)React组件更新流程详解
- React源码学习入门(十二)DOM组件更新流程与Diff算法
- R语言Lasso回归模型变量选择和糖尿病发展预测模型|附代码数据
- 我用300行代码实现了React
- React源码学习进阶篇(一)新版React如何调试源码?
- React源码学习进阶(二)初识Fiber架构
- React源码学习进阶(三)rootFiber的创建流程
- React源码学习进阶(四)render流程的入口逻辑详解