【问题标题】:java.lang.NoClassDefFoundError with static final methodjava.lang.NoClassDefFoundError 与静态最终方法
【发布时间】:2013-06-19 07:07:54
【问题描述】:

我有一个具有静态最终方法的类。[比如说 A、B、C]。

C调用另一个类D[D的包被导入C]。

我没有包 D 的 maven 程序集 jar[比如 M.jar]。 在运行时,当我尝试在类路径中调用具有 M.jar 的 A 时,出现 noclasdef 错误,说 D 不存在。

为什么我会得到这个?

package TEST1
import test.CHECK.TestA;
import test.CHECK.TestB;
class Factory

{

final static A()
{
//some ref to test.CHECK.TestA
}


 static B()
{
//some ref to test.CHECK.TestB
}

static  C()
{
}

我有一个包含此类的 jar,并在该 jar 中打包了 test.CHECK.TestB。但是,这个 jar 不包含 test.CHECK.TestA。

现在,我有这个 jar 的客户端程序调用 C()。 然后,为 TestA 获取 ClassNotFoundException,尽管我们没有调用 A()。为什么会这样?

【问题讨论】:

  • 不要混淆代码,变得难以理解
  • 请在此处发布您的代码..
  • 请提供更多细节来解释您的问题 - 显示一些真实代码将增加答案的可能性
  • 你是如何构建你的 jar 的? D 类是你自己的代码还是外部依赖?
  • 把你的代码....只有我们才能理解你真正想说的。或者放一个相同概念的图片...

标签: java noclassdeffounderror


【解决方案1】:

No class def found 错误意味着找到了您的类,但 JVM 在运行时未能加载它。大多数情况下,问题是您的 D 类没有加载到与调用它的类相同的类加载器中。另一个问题可能来自 D 类初始化,该初始化由于一些不明原因而失败......如果您需要帮助,我们需要您提供完整的堆栈跟踪。

【讨论】:

  • "另一个 pb 可能来自失败的 D 类初始化"
  • 视情况而定。我认为如果出现问题,静态块初始化会引发 no class def found 错误,因为 JVM 无法加载类定义
【解决方案2】:

为什么会收到 ClassNotFoundException:

当 JVM 在内存中加载一个类时,它也会尝试加载它的依赖项(这个类的代码依赖的其他类)。由于您的类引用了 test.CHECK.TestA,JVM 也会尝试加载这个缺失的类(参见 Java 虚拟机规范,第 12 章,同样是:ClassLoader : possible configure to use lazy and not static resolution?)。

如何让JVM不尝试加载丢失的类?:

至少在 Oracle 的 JVM 中这是不可能的

可能的解决方案:

尝试在 Google/Bing/Whatever 中搜索丢失类的全名(包括包名),看看是否能找到丢失的类并将其添加到类路径中

另一种可能的解决方案(非常丑陋的解决方法——孩子们,不要在家里这样做):

如果你找不到这样的类,如果你迫切地想要运行这个类,并且你完全确定方法 A 从未使用过,即使是你使用的方法 C,然后尝试“模拟”(写“空”替代)缺失的包、缺失的类和缺失的方法;这将涉及编译/执行/error_throw/edit_again 的尝试错误过程。我知道这非常丑陋,但最终你可以让你的课程运行起来。

【讨论】:

    【解决方案3】:

    我认为问题是当您调用C() 静态方法时,您的代码将第一次引用Factory 类(假设它没有加载到内存中)。

    所以当你的Factory 类被加载时,它会尝试加载所有的static 方法,而那时JVM 由于某种原因无法加载TestA 类,这就是错误出现的原因。

    尝试从调用C()的类中调用A()方法,看看是否成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多