Java .jar文件移出后出现NoClassDefFoundError异常

Java .jar文件移出后出现NoClassDefFoundError异常,java,jar,classloader,Java,Jar,Classloader,我们有一个奇怪的问题,两个Java进程a和B加载同一个jar文件(不是同一文件的两个单独副本,同一个实际文件) .jar文件被一个较新的副本替换(重新命名为.jar_,然后以其速度复制一个新文件),其中一个Java进程(a)重新启动。另一个Java进程(B)保持运行 过程A工作没有任何问题 当进程B尝试使用我们更新的.jar中的一个类时,它会收到一个NoClassDefFoundError异常。以前已加载“未找到”的类 通过jar-x进行的调查显示,“缺失”类实际上存在于jar的旧版本和新版本中

我们有一个奇怪的问题,两个Java进程a和B加载同一个jar文件(不是同一文件的两个单独副本,同一个实际文件)

.jar文件被一个较新的副本替换(重新命名为.jar_,然后以其速度复制一个新文件),其中一个Java进程(a)重新启动。另一个Java进程(B)保持运行

过程A工作没有任何问题

当进程B尝试使用我们更新的.jar中的一个类时,它会收到一个NoClassDefFoundError异常。以前已加载“未找到”的类

通过
jar-x
进行的调查显示,“缺失”类实际上存在于jar的旧版本和新版本中,在jar文件中的相同位置,并且类本身没有改变

重新启动进程B修复了该问题

是什么导致了这种行为

我目前的猜测是:当重命名.jar文件时,标准Java类加载器或某些自定义类加载器会使jar中的类无效。但我找不到任何关于这方面的文档,我以前的理解是classloader不会对丢失的.jar文件进行任何此类监视

我很确定我们也没有使用任何自定义类装入器

Java版本:1.8.0_144-b01


操作系统版本:Red Hat Enterprise Linux Server 6.9版(圣地亚哥)

我认为您的问题源于您更改了jar的名称,并试图用相同名称的不同文件覆盖它。JVM不喜欢这样

我相信您的问题源于您更改了jar的名称,并试图用相同名称的不同文件覆盖它。JVM不喜欢这样

尝试使用普通单类JAR复制行为未成功尝试使用普通单类JAR复制行为未成功谢谢。我看到了那个问题。你能告诉我有关的细节吗?到目前为止,我看到的最接近的一件事是H2ONaCl的评论:“在Ubuntu和Oracle的JDK上,我遇到了一个NoClassDefined异常,我相信最有可能的解释是,在上一个版本运行时,JAR被覆盖了。”。这是另一个用户遇到相同问题的迹象,但不一定解释问题发生的原因在任何情况下,我都会尝试用简单的罐子测试你说的话,并让你知道。没有成功。在
mv
cp
之后,简单的示例继续运行。谢谢。我看到了那个问题。你能告诉我有关的细节吗?到目前为止,我看到的最接近的一件事是H2ONaCl的评论:“在Ubuntu和Oracle的JDK上,我遇到了一个NoClassDefined异常,我相信最有可能的解释是,在上一个版本运行时,JAR被覆盖了。”。这是另一个用户遇到相同问题的迹象,但不一定解释问题发生的原因在任何情况下,我都会尝试用简单的罐子测试你说的话,并让你知道。没有成功。在
mv
cp
之后,简单的示例继续运行。