【问题标题】:NoClassDefFoundError exception after .jar file moved away.jar 文件移走后出现 NoClassDefFoundError 异常
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 谢谢。我看到了那个问题。你能指出相关的细节吗?到目前为止,我看到的最接近的是 H2ONaCl 的评论:“在 Ubuntu 和 Oracle 的 JDK 上,我遇到了 NoClassDefined 异常,我相信最可能的解释是在之前的版本运行时覆盖了 JAR。”。这表明另一个用户遇到了同样的问题,但不一定解释问题发生的原因
  • 无论如何,我会尝试用简单的罐子测试你所说的内容并让你知道。
  • 没有成功。在mvcp 之后,简单示例继续运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
相关资源
最近更新 更多