如果底层jar被替换,Java程序将崩溃

如果底层jar被替换,Java程序将崩溃,java,continuous-deployment,Java,Continuous Deployment,我有一个软件,包含在一个.jar中,它正在执行它的工作,但有时我需要快速推出一个bug修复程序,需要在一个中心位置替换.jar文件,不幸的是,如果这个jar文件当前正在运行,如果我替换它,它就会崩溃,并出现“未找到类”错误。我认为,一旦执行了jar文件,JVM就会将其缓存在内存中,并且不会从磁盘进行任何读取,但显然不是这样,如何(如果可能的话)纠正这种情况 编辑: 该应用程序不是基于web的。这是普通的Java SE。我能想到的唯一两种可能性是使用or。JAR文件不会像其他共享对象库那样批量加载

我有一个软件,包含在一个.jar中,它正在执行它的工作,但有时我需要快速推出一个bug修复程序,需要在一个中心位置替换.jar文件,不幸的是,如果这个jar文件当前正在运行,如果我替换它,它就会崩溃,并出现“未找到类”错误。我认为,一旦执行了jar文件,JVM就会将其缓存在内存中,并且不会从磁盘进行任何读取,但显然不是这样,如何(如果可能的话)纠正这种情况

编辑:


该应用程序不是基于web的。这是普通的Java SE。

我能想到的唯一两种可能性是使用or。

JAR文件不会像其他共享对象库那样批量加载到内存中。它们的类是按需加载到内存中的,因此如果删除JAR文件并且需要进行类查找,那么类加载器的文件句柄将无效(因为它引用的打开文件现在已不存在),并且您将得到一个错误

操作系统管理文件句柄,因此用新副本替换打开的文件不会欺骗任何人。您需要首先关闭文件,这通常只能通过垃圾收集类装入器来完成。如果您使用的是系统类加载器,那么这意味着关闭JVM

人们编写了框架来创建自定义类加载器,这些类加载器可以独立于系统类加载器进行处理;但是,这会使类加载复杂化。虽然它可以完成您的要求,但如果不重新构造现有程序以适应框架类装入器中类的查找(并适应随着时间的推移类装入器的丢失和增加),它就无法完成

如果你想尝试这样的框架,请参阅Christian的帖子。如果您想了解更多关于一个项目如何使用类加载器来满足其需求的信息,请看一看Apache的Tomcat,它将web应用程序限制在自己的类加载器中


通常,您可能会发现正确的答案是在部署之前停止服务,并在部署之后启动服务。

为什么不停止执行,更换jar,然后重新启动它?然后您可以编写一个脚本。将更新后的jar放到某个文件夹中,运行脚本停止它,复制新的jar,然后重新启动它。
时间就是金钱:)
-如果你的程序正在崩溃,则不会。所以这个问题可能会为你解答一些问题。