移除.jar文件后的NoClassDefFoundError异常

时间:2017-11-01 18:13:03

标签: java jar classloader

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

将.jar文件替换为较新的副本(重命名为.jar_BACK,然后按其速度复制新文件),并重新启动其中一个Java进程(A)。另一个Java进程(B)继续运行。

进程A没有任何问题。

当进程B尝试使用我们更新的.jar中的一个类时,它会获得NoClassDefFoundError异常。找不到的班级"未找到"已经装好了。

jar -x调查显示"缺失" class实际上存在于jar的旧版本和新版本中,在jar文件中的相同位置,类本身不变。

重新启动进程B可以解决问题。

会导致这种行为的原因是什么?

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

我很确定我们也没有使用任何自定义类加载器。

Java版本:1.8.0_144-b01

操作系统版本:红帽企业Linux服务器版本6.9(圣地亚哥)

1 个答案:

答案 0 :(得分:0)

我认为您的问题源于您更改了jar的名称并尝试使用不同的同名文件覆盖它。 JVM不喜欢这样。 This question probably has the details you want.