在运行时交换正在运行的jar

我正在构建一个更新系统,我需要能够在运行时替换正在运行的应用程序jar的引用jar。 但是,当尝试在jar上执行文件实用程序function(例如’setLastModified’)时,我在Windows上遇到文件锁定问题。

经过一些谷歌搜索我发现这个片段…

我在研究中发现,标准的ClassLoader实现一旦打开就永远不会关闭它。 它还只根据需要从jar文件中加载资源。 因此,在任何特定时间,jar文件中可能存在尚未加载到内存中的类。 显然,如果你从ClassLoader下删除jar文件,并且它试图在丢失的文件中找到一个资源,那么你至少会得到一个IOException。

有没有人提到有关这样做的信息,或解决这个问题?

谢谢。

有很多类/ lib热交换的解决方案:

  • ant的热交换
  • JRebel的
  • OSGi的

这取决于你想做什么。

最接近的是OSGi

请查看上述关于混凝土产品的artice的“另请参见”部分。

我不知道有什么好办法可以解决这个问题。 创建一个自定义类加载器可能是一个选项,虽然我不喜欢这个想法..

我们通过在启动主应用程序之前从单独的jar运行更新程序来解决它。 这很好用,但很明显,你只能在启动应用程序时更新jar。