非常奇怪的 NoClassDefFoundError

Very weird NoClassDefFoundError

我遇到了一个 NoClassDefFoundError 错误。由于可用信息不多,而且我 100% 肯定 class 在那里,我使用 Eclipse 调试器进行了一些详细测试:

  1. 在调试模式下启动Java程序
  2. 当它停止(某处)时,我检查 运行 线程的 class 路径(在调试模式下)。 "missing"class的目录在那里,.class文件也在
  3. 在表达式window中,我添加了两个表达式:

    a) new MyClass() --> 导致 NoClassDefFoundError

    b) MyClass.class -> 显示 Class 定义!?!?

  4. 我在 MyClass 的构造函数的第一行下了一个断点,它永远不会停在那里,所以永远不会调用构造函数... Calling private static final fields on the class ] 从调试开始工作 Window...

怎么可能?我还用 VisualVM 监视了这个过程,我可以看到 "MyClass" 定义。当 class 存在时,什么会导致这样的错误?

我无法得到这种情况的可复制的小例子,因为我不知道是什么原因造成的。 class 的单元测试可以实例化它,这种行为只发生在集成上下文中。

我认为 NoClassDefFoundError 可能是由于链接问题。当你这样做时:

MyClass.class

您正在加载 class 但未对其进行初始化;这意味着不需要解析初始化中使用的引用。另一方面,当您创建实例时:

new MyClass()

... class 确实需要初始化,需要解析引用,此时您可能会失败 - 确实如此。对我来说,这意味着 class 指的是另一个 class 由于某种原因无法加载,或者 class 的初始化失败(尽管后者通常给出 ExceptionInInitializerError 代替)。

如果在初始化 class 时出现故障,通常会发生这种情况,通常是当我们在 static blocks 中有一个 exception 时,因此您应该检查所有 static blocks确保其中 none 抛出 RuntimeException.