NoClassDefFoundError:A(错误的名字:A)

时间:2012-02-04 16:34:17

标签: java classloader noclassdeffounderror

在以前工作的应用程序中突然出现了NoClassDefFoundError (wrong name),这让我很困惑。我正在使用XML绑定框架,它尝试通过使用配置的类名调用ClassLoader.loadClass()来在请求时解析绑定类。 (在这种情况下,为什么它的行为超出了我的范围。)现在我得到了java.lang.ClassLoader.defineClass()刚才提到的异常。该方法的文档说如果参数NoClassDefFoundError不等于指定类的二进制名称,它将抛出name。我知道在这种情况下,人们希望获得表格的例外

java.lang.NoClassDefFoundError: A (wrong name: B)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:786)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
    ....

这是我实际看到的结果,但奇怪的是,在我的情况下,报告的AB完全相同!我试着调试应用程序。 JDK源代码中的行显示为:

        c = defineClass1(name, b, off, len, protectionDomain, source);

source的值是可以的。我将字节数组b保存到类文件中并使用反编译器进行检查,然后再次确定。当然Class.forName()始终报告相同的错误,但非常有趣的事情是,如果我在调试模式下设置name = null,我会得到这个野兽:

java.lang.LinkageError: loader (instance of  com/google/gwt/dev/shell/jetty/JettyLauncher$WebAppContextWithReload$WebAppClassLoaderExtension): attempted  duplicate class definition for name: "A"
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:786)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)

现在我对此感到完全无能为力:(感谢您的帮助。

有问题的类加载器是com.google.gwt.dev.shell.jetty.JettyLauncher.WebAppContextWithReload.WebAppClassLoaderExtension,如果重要的话。

2 个答案:

答案 0 :(得分:5)

解决。只是一个令人尴尬的资本化问题。 A实际中的名称BNoClassDefFoundError: A (wrong name: B) 的大小不同。

这种情况发生在Windows上,因为它的不区分大小写的文件系统。如果您查找名为FooBar的类并且该文件夹包含文件Foobar.class,则类加载器会打开类文件,但在内部发现它具有不同的名称。因此例外。

答案 1 :(得分:0)

检查A类和B类的包声明。有可能它们在某个包中没有包声明,或者包声明不正确。