NoClassDefFoundError: A (неправильное имя: A) - PullRequest
1 голос
/ 04 февраля 2012

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

Ответы [ 2 ]

5 голосов
/ 05 февраля 2012

решаемая. Просто смущающая проблема капитализации. Имена A и B в NoClassDefFoundError: A (wrong name: B) на самом деле действительно отличаются заглавными буквами.

Это происходит в Windows из-за нечувствительной к регистру файловой системы. Если вы ищете класс с именем FooBar и папка содержит файл Foobar.class, загрузчик классов открывает файл класса, но обнаруживает, что внутри он имеет другое имя. Отсюда и исключение.

0 голосов
/ 04 февраля 2012

Проверьте объявление пакета для классов A и B. Скорее всего, они либо без объявления пакета внутри некоторого пакета, либо объявление пакета неверно.

...