2013-06-19 29 views
-1

我有一个有静态final方法的类[说A,B,C]。静态final方法的java.lang.NoClassDefFoundError

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

Maven组装jar [说M.jar],我没有包D。 在运行时,当我尝试调用类路径中具有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包含此类和包test.CHECK.TestB在该jar中。但是,这个jar不包含test.CHECK.TestA。

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

+5

不要混淆代码,变得很难理解 –

+0

请在这里发表您的代码.. –

+0

请提供更多的细节来说明你的问题 - 显示出一些实际的代码将上升答案 – mschenk74

回答

2

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

+1

“另一个pb可能来自D类初始化失败”< - 如果发生这种情况,则会依赖于此NoClassDefFoundError – fge

+0

之前的另一个异常。我认为如果因为JVM无法加载类定义而出现错误,那么静态块初始化会引发无类定义错误 – omartin

+0

我提供了详细信息 – user170114

0

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

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

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

1

为什么你得到ClassNotFoundException的

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

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

这是不可能的,至少与Oracle的JVM

可能的解决方案

尝试在谷歌/冰/不管,看是否缺少类的全名(包括包名)搜索你可以找到丢失的类,并把它添加到你的classpath

另一种可能的解决方案(极其丑陋的解决方法 - 孩子,在家里不这样做)

如果你找不到这样的类,并且如果你迫不及待地让它运行,那么你完全可以确保方法A从来没有被使用,即使通过方法C这是你使用的方法,然后尝试通过“嘲弄”(写下“空白”替代品)丢失的包裹,缺失的类别和缺少的方法;这将涉及编译/执行/ error_thrown/edit_again的尝试错误过程。我知道这是非常丑陋的,但在一天结束时,你可以让你的班级跑步。