在运行时交换jar文件

5
我正在构建一个更新系统,需要在运行时替换正在运行的应用程序 jar 的引用 jar。但是,在 Windows 上尝试执行文件实用程序函数(如“setLastModified”)时,我遇到了文件锁定问题。
经过一些搜索,我找到了以下代码片段...
引用块:

在我的研究中发现, 标准的ClassLoader实现从未关闭jar文件一旦它被打开。它也只在需要时从jar文件中加载资源。因此,在任何特定时间,可能有Classes在jar文件中没有加载到内存中。显然,如果您在ClassLoader下删除jar文件,并且它尝试在缺少的文件中查找资源,您将至少会得到一个IOException。

是否有人有关于如何做到这一点或解决此问题的信息的参考?
谢谢。

你需要重新发明轮子吗?OSGi已经有热部署了。看看是否可以使用它。 - SteveD
OSGi 对于大多数需求来说可能会感到压倒性,请看看这个答案:https://dev59.com/nEzSa4cB1Zd3GeqPoKCy#2463978 - Jaime Hablutzel
重新阅读后,似乎您想让应用程序保持运行状态,但使用新的JAR文件...因此,OSGi看起来确实是一个很好的解决方案:),例如Eclipse允许这样做(插件在运行时重新加载),并使用OSGi进行此操作(据我所知)。 - Jaime Hablutzel
3个回答

6

2
OSGi很庞大,而JRebel只适用于开发,因为它需要昂贵的许可证(对于OSS项目免费)。不确定Ant的Hotswap。 - TheLQ

2
最接近的东西是OSGi
请查看上述文章的“另请参阅”部分以获取具体产品。

0

我不知道有什么好的方法来处理这个问题。创建一个自定义类加载器可能是一个选项,尽管我不喜欢这个想法。

我们通过在启动主应用程序之前从一个单独的jar中运行更新程序来解决了这个问题。这样做相当不错,但显然,只能在启动应用程序时更新jar。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接