【发布时间】:2010-12-17 10:17:03
【问题描述】:
我有一些应用程序,它具有自我更新的能力。它从网上下载jar文件,然后尝试用下载的jar替换使用的jar来运行这个应用程序。 但我不能这样做,因为文件被 Windows 锁定,因为应用程序仍在运行。
有人知道解决方法吗?
【问题讨论】:
我有一些应用程序,它具有自我更新的能力。它从网上下载jar文件,然后尝试用下载的jar替换使用的jar来运行这个应用程序。 但我不能这样做,因为文件被 Windows 锁定,因为应用程序仍在运行。
有人知道解决方法吗?
【问题讨论】:
对此的一种流行解决方案是将更新程序作为单独的程序运行。您是否注意到 Firefox 在更新时必须重新启动?那是因为一个单独的进程 (updater.exe) 正在更新文件,然后再次启动 Firefox。
您可以尝试这种方法。我看到的唯一障碍是试图使 MAIN 程序自动关闭。唯一可移植的方法(在我的脑海中)是让主应用程序通过本地套接字等待终止信号,并且更新程序可以通过本地网络发送命令。您必须考虑的另一件事是更新程序必须在单独的 java 进程中运行。如果您的主程序只是创建了一个新的 Updater 对象,则 Updater 将与主程序的 JVM 共存,这将您带回到第一个问题。
【讨论】:
我认为正确的做法是重新启动应用程序。如果你可以在 runtime 更新 jar 的事件,之后可能会因为类版本、不同的类、不同的实现等而发生各种错误。
【讨论】:
这是 OSGi已经解决的问题。
真正的问题是不加载新的 jar 版本。这可以通过您自己的释放文件锁的类加载器来完成。真正的问题是如何handle instances of different versions of the same class。
重启确实忽略了这些问题。如果您确实需要在一个应用程序中使用不同的 jar 版本,请使用 OSGi。
【讨论】:
执行此操作的典型方法是编写一个单独的更新程序,当您的主程序看到更新时将调用该更新程序。这时候你的主程序可以在一个新进程中启动更新程序并退出。您的更新者可以等待主程序退出,下载并复制更新的文件并重新启动您的主程序
【讨论】: