Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时交换正在运行的jar_Java_File_Plugins_Jar_Locking - Fatal编程技术网

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

Java 在运行时交换正在运行的jar,java,file,plugins,jar,locking,Java,File,Plugins,Jar,Locking,我正在构建一个更新系统,在该系统中,我需要能够在运行时替换正在运行的应用程序jar的引用jar。但是,当我尝试在jar上执行文件实用程序功能(如“setLastModified”)时,我在Windows上遇到了文件锁定问题 在谷歌搜索之后,我发现了这个片段 我在研究中发现 标准类加载器 实现从不关闭jar 文件一旦被打开。它也 仅从jar文件加载资源 根据需要。所以在任何时候,, jar文件中可能有类 尚未加载到内存中的。 显然,如果删除jar文件 从类加载器下面出来,它 尝试在中查找资源 缺少

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

在谷歌搜索之后,我发现了这个片段

我在研究中发现 标准类加载器 实现从不关闭jar 文件一旦被打开。它也 仅从jar文件加载资源 根据需要。所以在任何时候,, jar文件中可能有类 尚未加载到内存中的。 显然,如果删除jar文件 从类加载器下面出来,它 尝试在中查找资源 缺少文件,你会得到一个 至少是例外

是否有人参考过关于此操作或解决此问题的信息

谢谢。

最近的事情是


请参阅上述文章中混凝土产品的“另见”部分

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


我们通过在启动主应用程序之前从单独的jar运行更新程序来解决这个问题。这已经足够好了,但是很明显,您只能在应用程序启动时更新jar。

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


这取决于你想做什么。

你需要重新发明轮子吗?OSGi已经有了热部署。看看你是否可以用它来代替。OSGi听上去对大多数需求来说都是压倒性的,在重新阅读后看看这个答案,你似乎想让你的应用程序运行,但是使用了新的JAR。。。所以OSGi看起来真的是一个很好的解决方案:),例如Eclipse允许这样做(插件在运行时重新加载)并使用OSGi(据我所知)。OSGi非常庞大,JRebel只用于开发,因为它需要昂贵的许可证(OSS项目免费)。不确定ant的热交换