Sai*_*ali 1 java noclassdeffounderror classloader
在一个以前工作的应用程序突然间,我得到了一个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)
....
Run Code Online (Sandbox Code Playgroud)
这是我实际看到的结果,但奇怪的是,在我的情况下,报告A和B完全一样!我试着调试应用程序.JDK源代码中的行如下:
c = defineClass1(name, b, off, len, protectionDomain, source);
Run Code Online (Sandbox Code Playgroud)
价值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)
Run Code Online (Sandbox Code Playgroud)
现在我对此感到完全无能为力:(感谢您的帮助.
有问题的类加载器是com.google.gwt.dev.shell.jetty.JettyLauncher.WebAppContextWithReload.WebAppClassLoaderExtension重要的.
解决了.只是一个令人尴尬的资本化问题.名称A和B在NoClassDefFoundError: A (wrong name: B)实际上没有被资本化不同.
这种情况发生在Windows上,因为它不区分大小写的文件系统.如果您查找名为FooBar且该文件夹包含文件Foobar.class的类,则类加载器将打开该类文件,但在内部发现它具有不同的名称.因此例外.