【问题标题】:Running an external program before exiting java sometime fails在退出 java 之前运行外部程序有时会失败
【发布时间】:2018-10-01 13:26:50
【问题描述】:

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

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

当然,有些运行该程序的系统启用了 UAC,有些则没有,而且似乎是 UAC 系统造成了麻烦。我不知道是提升请求的延迟还是时间/文件锁定的问题。

有没有人尝试过使用 java 创建自己的更新程序,或者看过关于处理这些类型问题的好指南?

【问题讨论】:

    标签: java windows uac


    【解决方案1】:

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

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

    • 启动您的应用,
    • 如果以某种方式发出信号(如特殊的 exitCode),则运行 Mover.exe
    • (几乎)不需要自行更新

    那么您必须确保您的应用仅通过此启动器启动。

    【讨论】:

      【解决方案2】:

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

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

      类路径可能是一个带有 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)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-16
        • 2021-10-23
        • 1970-01-01
        • 2019-05-19
        • 2015-12-21
        • 2011-09-18
        • 2014-09-09
        • 1970-01-01
        相关资源
        最近更新 更多