Еще одна странная ошибка NoClassDefFoundError в WhiteSpaceProcessor - PullRequest
1 голос
/ 14 октября 2011

У меня странная проблема уже несколько дней.

Только один пользователей моего веб-приложения получает NoClassDefFoundError при попытке использовать некоторые функции. Это трассировка стека:

java.lang.NoClassDefFoundError: com/sun/xml/bind/WhiteSpaceProcessor
    at com.sun.xml.bind.DatatypeConverterImpl._parseInt(DatatypeConverterImpl.java:105)
    at com.foo.bar.webservice.generated.GetLoginsRequest_JaxbXducedAccessor_panelId.parse(TransducedAccessor_field_Integer.java:32)
    at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:166)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:406)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:384)
    at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:35)
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:101)
    at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:224)
    at com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:107)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:289)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:272)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:106)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:424)

Странным образом WhiteSpaceProcessor невозможно найти, пока он находится на пути к классам. Я использовал tattletale , чтобы посмотреть на возможности использования классов:

WhiteSpaceProcessor существует только один раз на пути к классам: enter image description here

DatatypeConverterImpl существует только один раз на пути к классам enter image description here

Я застрял на том факте, что точная война в другой среде работает идеально.

рабочая среда:

  • Windows machine
  • Tomcat 5.5.28
  • Java 5 (jdk1.5.0.22)

нет рабочей среды:

  • Linux-машина
  • Tomcat 5.5 .??
  • Java 5 (jdk1.5.0.22)

Надеюсь, кто-нибудь может направить меня в правильном направлении.

Сервер Tomcat уже перезапущен

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

NoClassDefFoundError не означает , что означает, что файл класса не найден в пути к классам. Это означает, что класс не может быть загружен. Обычно это происходит из-за ошибки во время инициализации или, чаще, из-за несоответствия версий в файлах JAR, от которых зависит класс.

Например, вы, вероятно, скомпилировали пакет XYZ версии 1.2, и у вашего пользователя установлена ​​версия XYZ 1.1.

2 голосов
/ 14 октября 2011

Использовали ли вы tattletale на работающем или нерабочем компьютере?

Возможно, в сбойной среде содержится какой-то jar-файл в jre / lib / ext (или аналогичном каталоге расширений), и это используется в настройкахв «более низкую» версию?

РЕДАКТИРОВАТЬ: Просто чтобы немного подробнее узнать о ситуациях, в которых может быть выброшено NoClassDefFoundError, стоит прочитать спецификацию JVM, глава 5 * 1007.*.В нем говорится о трех ситуациях:

  • Ресурс, соответствующий классу, вообще не может быть найден
  • Ресурс найден, но не соответствует нужному классу (хотяв этом случае я ожидаю сообщение с «неправильным именем»)
  • Вы используете версию Java более раннюю, чем 1.2, а файл класса имеет неподдерживаемый номер основной / вспомогательной версии.(Эта ситуация теперь выдает UnsupportedClassVersionError.)

Также читайте раздел 2.17.5 : в нем говорится, что если класс находится в «ошибочном состоянии» (например, ранее инициализация не удалась)или произошел сбой проверки байт-кода), тогда будет выдано NoClassDefFoundError.

Теперь, если статический инициализатор класса завершится неудачно, тогда первый вызывающий абонент увидит ExceptionInInitializerError - но второй абонент видит NoClassDefFoundError.Вот короткая, но полная программа, демонстрирующая это:

class Foo {
    static {
        if (true) {
            throw new RuntimeException();
        }
    }

    static void foo() {
    }
}

public class Test {

    public static void main(String[] args) {
        try {
            Foo.foo();
        } catch (Throwable t) {
            System.out.println("First exception: " + t);
        }
        try {
            Foo.foo();
        } catch (Throwable t) {
            System.out.println("Second exception: " + t);
        }
    }
}

Теперь, если что-то в вашей системе не подавляет ExceptionInInitializerError, я бы ожидал , чтобы увидеть это в журнале до NoClassDefFoundError если бы это была проблема.Я все еще думаю, что более вероятно , что ваша неисправная система загружает один класс в загрузчик классов расширений, который затем не может найти класс ShiteSpaceProcessor.

...