【发布时间】:2018-04-14 03:27:47
【问题描述】:
我们有一个奇怪的问题,两个 Java 进程 A 和 B 加载相同的 jar 文件(不是相同文件的 2 个单独副本,相同的实际文件)。
.jar 文件被替换为较新的副本(重命名为 .jar_BACK,然后按其速度复制了一个新文件),其中一个 Java 进程 (A) 重新启动。另一个 Java 进程 (B) 继续运行。
进程 A 没有任何问题。
当进程 B 尝试使用我们更新的 .jar 中的某个类时,它会收到 NoClassDefFoundError 异常。之前已经加载了“未找到”的类。
jar -x 的调查表明,“缺失”类实际上存在于新旧版本的 jar 中,位于 jar 文件中的相同位置,并且类本身没有改变。
重启进程 B 解决问题。
什么会导致这种行为?
我目前的猜测是:当重命名 .jar 文件时,标准 Java 类加载器或某些自定义类加载器会使 jar 中的类无效。但是我找不到这方面的任何文档,而我之前的理解是类加载器不会对丢失的 .jar 文件进行任何此类监控。
我很确定我们也没有使用任何自定义类加载器。
Java 版本:1.8.0_144-b01
操作系统版本:Red Hat Enterprise Linux Server 6.9 版(圣地亚哥)
【问题讨论】:
-
尝试用普通的单类 jar 重现行为没有成功
标签: java jar classloader