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

带有静态final方法的java.lang.NoClassDefFoundError,java,noclassdeffounderror,Java,Noclassdeffounderror,我有一个类有静态的final方法 C调用另一个类D[D的包在C中导入] 我拥有的maven程序集jar[say M.jar]没有包D。 在运行时,当我试图在类路径中调用having M.jar时,得到noclasdef错误,表示D不存在 为什么我会得到这个 包测试1 导入test.CHECK.TestA; 导入test.CHECK.TestB; 阶级工厂 { 最终静态A { //一些参考文件用于test.CHECK.TestA } 静态B { //test.CHECK.TestB的一些参考 }

我有一个类有静态的final方法

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

我拥有的maven程序集jar[say M.jar]没有包D。 在运行时,当我试图在类路径中调用having M.jar时,得到noclasdef错误,表示D不存在

为什么我会得到这个

包测试1 导入test.CHECK.TestA; 导入test.CHECK.TestB; 阶级工厂 { 最终静态A { //一些参考文件用于test.CHECK.TestA } 静态B { //test.CHECK.TestB的一些参考 } 静态C { } 我有一个包含这个类的jar,在那个jar中有一个包test.CHECK.TestB。但是,这个jar不包含test.CHECK.TestA

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

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

我认为问题在于,当您调用C静态方法时,您的代码将首次引用Factory类,假定它未加载到内存中

因此,当加载工厂类时,它将尝试加载所有静态方法,而此时JVM由于某种原因无法加载TestA类,这就是错误出现的原因

尝试从调用C的类中调用一个方法,看看它是否成功。

为什么会得到ClassNotFoundException:

当JVM在内存中加载一个类时,它会尝试加载它的依赖项以及这个类的代码所依赖的其他类。由于您的类引用了test.CHECK.TestA,JVM也会尝试加载这个缺少的类。请参阅Java虚拟机规范,第12章,还有以下内容:

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

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

可能的解决办法:

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

另一个可能的解决方案是非常丑陋的变通方法-儿童,不要在家里这样做:


如果你找不到这样的类,如果你非常想运行它,并且你完全确定方法A从未被使用过,即使是你使用的方法C,那么试着用mocking write empty替换缺少的包、缺少的类和缺少的方法;这将涉及编译/执行/抛出错误的try-error过程/再次编辑。我知道这非常难看,但最终你可以让你的类运行。

不要混淆代码,变得难以理解,请在这里发布你的代码。请提供更多详细信息来解释你的问题-显示一些真实的代码会增加回答的可能性。显示你构建了jar吗?D类是你自己的代码还是a类n外部依赖性?放上你的代码…然后只有我们才能理解你真正想说什么。或者放一个相同概念的映像…另一个pb可能来自D类初始化,这取决于失败。我认为静态块初始化会在出现问题时引发“找不到类定义”错误,因为JVM无法load类定义