在运行时交换正在运行的jar
我正在构建一个更新系统,我需要能够在运行时替换正在运行的应用程序jar的引用jar。 但是,当尝试在jar上执行文件实用程序function(例如’setLastModified’)时,我在Windows上遇到文件锁定问题。
经过一些谷歌搜索我发现这个片段…
我在研究中发现,标准的ClassLoader实现一旦打开就永远不会关闭它。 它还只根据需要从jar文件中加载资源。 因此,在任何特定时间,jar文件中可能存在尚未加载到内存中的类。 显然,如果你从ClassLoader下删除jar文件,并且它试图在丢失的文件中找到一个资源,那么你至少会得到一个IOException。
有没有人提到有关这样做的信息,或解决这个问题?
谢谢。
有很多类/ lib热交换的解决方案:
- ant的热交换
- JRebel的
- OSGi的
这取决于你想做什么。
最接近的是OSGi
请查看上述关于混凝土产品的artice的“另请参见”部分。
我不知道有什么好办法可以解决这个问题。 创建一个自定义类加载器可能是一个选项,虽然我不喜欢这个想法..
我们通过在启动主应用程序之前从单独的jar运行更新程序来解决它。 这很好用,但很明显,你只能在启动应用程序时更新jar。