我有一个有静态最终方法的课。[说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()。为什么会这样?
答案 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()
方法,看看它是否成功。