在以前工作的应用程序中突然出现了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)
....
这是我实际看到的结果,但奇怪的是,在我的情况下,报告的A
和B
完全相同!我试着调试应用程序。 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
,如果重要的话。
答案 0 :(得分:5)
解决。只是一个令人尴尬的资本化问题。 A
实际中的名称B
和NoClassDefFoundError: A (wrong name: B)
的大小不同。
这种情况发生在Windows上,因为它的不区分大小写的文件系统。如果您查找名为FooBar
的类并且该文件夹包含文件Foobar.class
,则类加载器会打开类文件,但在内部发现它具有不同的名称。因此例外。
答案 1 :(得分:0)
检查A类和B类的包声明。有可能它们在某个包中没有包声明,或者包声明不正确。