从Java

时间:2017-09-28 02:01:22

标签: java windows http batch-file restart

我找到了一种方法,使用Java编写的程序更新自己。最终的JAR通过Launch4j工具包装在EXE文件中。 你需要知道这段代码:

System.getProperty("java.class.path").replaceAll("\\;\\.$", "")

给出了EXE的实际路径。我测试了它,似乎总是在工作。这对于这个问题很重要。

现在,基本上该程序ping一个网页并读取一系列值,其中一个是该程序的最新版本。如果它更大,程序会通知用户更新。因此,程序下载远程数据(更新的EXE文件)并将它们存储在当前运行的EXE文件中,该文件的文件名是通过上述方法获得的。它有效,但问题出现了。

我可以简单地启动下载的EXE文件和System.exit当前版本,但我不能这样做,因为我的程序适用于智能卡:如果两个或多个程序使用相同的智能卡,则新的一个赢了&#39工作(我不知道为什么,我甚至每次重启提供者,但这是另一个故事)。因此,我阻止用户启动该程序的多个任务。

(我的客户不是那么聪明,每次他们需要时手动打开程序,所以我需要覆盖关闭按钮使其保持在托盘栏中,并在每次需要时唤醒。我甚至让它在启动时启动Windows启动)。

所以我必须关闭程序的当前实例,然后重新启动。 我是怎么做到的我写了一个基本上看起来像这样的批处理文件:

@echo off
taskkill /f /pid <pid of the exe program>
ping 127.0.0.1 -n 3 (this is a way to wait. I will eventually lower the waiting)
C:\Users\Mark\Desktop\program.exe (string generated by the method above. It should launch the program)
exit

写入磁盘后,我通过Java执行它:

Runtime.getRuntime().exec("cmd /c start " + batchFile.toString());

&#34;批处理文件&#34; variable是一个File对象。 问题是新下载的程序没有启动。出现一个控制台窗口,显示&#34; taskkill&#34;的结果。并且&#34; ping&#34; (我最终会把它们静音),但程序没有启动。如果我手动启动批处理文件,它会。 为什么?我真的不明白这种行为。 你有什么建议吗?

提前致谢!

TL; DR版本: 我的Java程序执行的批处理文件不会启动写在其中的exe文件。为什么呢?

1 个答案:

答案 0 :(得分:0)

我感觉您正在尝试覆盖当前正在运行的可执行文件 (EXE)。 AFAIK Windows 会锁定此类文件,因此您的更新不应发生。

要解决您的问题:我会将您的申请一分为二。 一部分确保另一部分具有最新版本,然后执行该最新版本。

对于 Java,类似这样的东西已经在多年前作为 WebStart 技术开发出来的,在 Java 9 中被标记为不推荐使用,然后被移除。同时,您可能想查看项目 https://openwebstart.com/