在退出Java之前运行外部程序失败

时间:2018-10-01 13:26:50

标签: java windows uac

我有一个Java程序,通过10个系统在Windows XP上运行,该程序在退出之前会调用程序(Mover.exe)。我想发生的是在Java程序退出后,Mover.exe应该覆盖并用下载的文件更新Java程序。

我正在使用new ProcessBuilder(progname, options).directory(tempDir).start(); 调用Mover.exe,但它只能间歇性地工作。

当然,某些运行该程序的系统已启用UAC,而有些则未启用,看来UAC系统是造成麻烦的系统。我不知道是由于“海拔升高”请求造成的延迟还是计时/文件锁定问题。

有人处理过尝试使用Java创建自己的更新程序的经历,还是看过处理此类问题的好指南?

2 个答案:

答案 0 :(得分:1)

前段时间,我通过生成.cmd批处理解决了类似的问题,该批处理会等待几秒钟,然后运行该工具(在您的情况下为Mover.exe)。

更漂亮的解决方案是拥有一个“启动器”应用程序

  • 启动您的应用,
  • 如果发出信号(例如特殊的exitCode),则运行Mover.exe
  • (几乎)永远不需要自己更新

然后,您必须确保仅通过此启动器启动您的应用。

答案 1 :(得分:0)

即插即用在Java中有一种形式:java SPI (服务提供接口)。

  • api.jar package x.y.z; public interface Pluggable { void exec(String[] args); }
  • mainapp.jar :通过接口检查类路径上的插件jar的微型应用程序,启动最新版本,或者删除最旧的版本。
  • plugin12.jar package u.v.w; public class Plugin12 extends Pluggable { ... },文本文件META-INF/services/x.y.z.Pluggableu.v.w.App12行。
  • plugin13.jar package u.v.w; public class Plugin13 extends Pluggable { ... },文本文件META-INF/services/x.y.z.Pluggableu.v.w.App13行。

classpath可能是带有jar的集合目录。

ServiceLoader<Pluggable> loader = ServiceLoader .load(Pluggable.class);
Iterator<Pluggable> iter = loader.iterator();
... pick by latest class name or such
pluggable.exec(args);

诚然,这是不同的工作方式,但不依赖于系统特定信息(Linux,任何Windows)。