我有一个Java程序,通过10个系统在Windows XP上运行,该程序在退出之前会调用程序(Mover.exe)。我想发生的是在Java程序退出后,Mover.exe应该覆盖并用下载的文件更新Java程序。
我正在使用new ProcessBuilder(progname, options).directory(tempDir).start();
调用Mover.exe,但它只能间歇性地工作。
当然,某些运行该程序的系统已启用UAC,而有些则未启用,看来UAC系统是造成麻烦的系统。我不知道是由于“海拔升高”请求造成的延迟还是计时/文件锁定问题。
有人处理过尝试使用Java创建自己的更新程序的经历,还是看过处理此类问题的好指南?
答案 0 :(得分:1)
前段时间,我通过生成.cmd
批处理解决了类似的问题,该批处理会等待几秒钟,然后运行该工具(在您的情况下为Mover.exe
)。
更漂亮的解决方案是拥有一个“启动器”应用程序
Mover.exe
,然后,您必须确保仅通过此启动器启动您的应用。
答案 1 :(得分:0)
即插即用在Java中有一种形式:java SPI (服务提供接口)。
package x.y.z; public interface Pluggable { void exec(String[] args); }
。package u.v.w; public class Plugin12 extends Pluggable { ... }
,文本文件META-INF/services/x.y.z.Pluggable
和u.v.w.App12
行。package u.v.w; public class Plugin13 extends Pluggable { ... }
,文本文件META-INF/services/x.y.z.Pluggable
和u.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)。