2010-09-01 115 views
5

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

一些谷歌上搜索,我发现这个片段后...

我在研究中发现,那是什么 标准的ClassLoader 实施从未关闭一个jar文件 一旦被打开。它也 只根据需要从jar文件 加载资源。因此在任何特定时间, 可能存在尚未加载到内存中的jar文件 中的类。 显然,如果您从ClassLoader下删除了jar文件 ,并且它 试图在 缺少的文件中查找资源,那么至少会得到一个012xxIOException。

有没有人有任何提及这方面的信息或解决此问题?

谢谢。

+0

你需要重新发明轮子吗? OSGi已经有了热门的部署。看一看,看看你是否可以用它来代替。 – SteveD 2010-09-01 19:41:27

+0

OSGi听起来像绝大多数要求压倒一切,看看这个答案http://stackoverflow.com/a/2463978/320594 – 2014-03-08 09:20:28

+0

重新阅读后,似乎你想保持你的应用程序运行,但与新的罐子......所以OSGi真的看起来像一个很好的解决方案:),例如Eclipse允许(插件在运行时重新加载)并使用OSGi(只要我知道)。 – 2014-03-08 09:23:31

回答

5

有很多关于类/ lib目录热插拔解决方案:

这取决于你想要做什么。

+2

OSGi是巨大的,JRebel仅用于开发,因为它需要昂贵的许可证(免费用于OSS项目)。不确定蚂蚁的Hotswap – TheLQ 2010-09-01 20:52:03

2

最接近的事是OSGi

请看看混凝土制品提到条每页的“参见”部分。

0

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

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