Внезапно в ранее работающем приложении я получаю 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
, если это имеет значение.