-1

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

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

我没有包 D 的 maven 程序集 jar [say 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()。为什么会这样?

4

3 回答 3

2

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

于 2013-06-19T07:15:55.480 回答
1

为什么你会得到 ClassNotFoundException

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

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

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

可能的解决方案

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

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

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

于 2013-06-27T02:51:39.487 回答
0

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

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

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

于 2013-06-26T17:45:44.087 回答