2009-11-17 82 views
6

我有一些应用程序,它具有更新自身的能力。它从网上下载jar文件,然后尝试用下载的jar文件替换用过的jar来运行该应用程序。 但我不能这样做,因为该文件被Windows锁定,因为应用程序仍在运行。如何删除由java中的窗口使用/锁定的文件

有人知道一些解决方法吗?

回答

4

这方面一个流行的解决方案是在运行更新为后单独的程序。你有没有注意到Firefox在更新时必须重启?那是因为一个单独的进程(updater.exe)正在更新文件,然后再次启动Firefox。

您可以尝试这种方法。我看到的唯一障碍是试图自动化MAIN程序来关闭自己。唯一可行的方法就是让主应用程序通过本地套接字等待kill信号,并且updater可以通过本地网络发送命令。还有一件事你必须考虑的是更新器必须在单独的java进程中运行。如果您的主程序只是创建一个新的Updater对象,则更新程序将与主程序的JVM共存,从而使您回到原来的状态。

2

我认为这里要做的正确的事情是重启的应用程序。事件,如果你能在运行更新JAR,所有类型的错误可能会发生,因为类的版本,不同的阶层,不同的实现等

0

这样做的典型方法是编写一个单独的更新程序,它将在主程序看到更新时调用它。此时,您的主程序可以在新进程中启动更新程序并退出。您更新可以等待主程序退出,下载并复制更新的文件,并重新启动您的主程序

2

这是一个问题OSGi已经解决了

真正的问题是不加载新的jar版本。这可以通过你自己的类加载器来完成,释放文件锁定。真正的问题是如何handle instances of different versions of the same class

重新启动会省略这些问题。如果你真的需要在一个应用程序中使用不同的jar版本,使用OSGi。