带有静态final方法的java.lang.NoClassDefFoundError

时间:2013-06-19 07:07:55

标签: java noclassdeffounderror

我有一个有静态最终方法的课。[说A,B,C]。

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

maven装配罐[说M.jar]我没有包装D. 在运行时,当我尝试在类路径中调用A有M.jar时,得到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()。为什么会这样?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

为什么你得到ClassNotFoundException

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

如何让JVM不要尝试加载缺少的类?

至少对于Oracle的JVM来说,这是不可能的

可能的解决方案

尝试在Google / Bing /中查找缺少类的全名(包括包名),看看是否可以找到缺少的类并将其添加到类路径中

另一种可能的解决方案(非常难看的解决方法 - 儿童,不要在家里这样做)

如果你不能找到这样的类,如果你是绝望,使这个运行,你是完全确定方法的从未使用过,甚至通过方法C中哪些是你用,然后通过“嘲讽”尝试一个(写“空”替代品)缺少的包,缺少的类和缺少的方法;这将涉及编译/执行/ error_thrown / edit_again的尝试错误过程。我知道这完全是丑陋的,但在一天结束时你可以让你的课程运行。

答案 2 :(得分:0)

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

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

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