Исключение класса Cast: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

Столкнулся с проблемой в jboss. Когда я пытаюсь развернуть свой .war на сервере, я получаю следующую ошибку:

java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.SAXParserF actoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory

из чего совершенно очевидно, что происходит конфликт библиотек. Итак, я удалил файл jar, содержащий xerces, что произошло с jaxp-ri-1.4.1.jar. Теперь, когда я пытаюсь повторно развернуть, я получаю эту новую ошибку,

java.lang.NullPointerException
    at org.apache.commons.digester.Digester.getXMLReader(Digester.java:944)
    at org.apache.commons.digester.Digester.parse(Digester.java:1765)
    at org.apache.struts.action.ActionServlet.initServlet(ActionServlet.java

где он жалуется, что не может найти парсеры xml.

Итак, теперь мои вопросы в том, что кто-нибудь знает, что может быть решением. Любой файл jar jaxp, который не содержит пакет xerces?

Обновить

Я сделал так, как было предложено здесь и теперь у меня новая ошибка,

java.lang.NoClassDefFoundError: Could not initialize class com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl

который представляет собой класс из одной из удаленных мной банок, которая содержит SaxParserFactory :(


person Ozyman    schedule 25.11.2010    source источник
comment
Привет, я сделал, как вы предложили, и теперь у меня есть новая ошибка, java.lang.NoClassDefFoundError: Не удалось инициализировать класс com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl, который является классом из одной из банок, которые я удалено, которое содержит SaxParserFactory :(   -  person Ozyman    schedule 25.11.2010
comment
Любая информация, которую мы могли бы иметь о недавно удаленном JAR?   -  person Vineet Reynolds    schedule 25.11.2010


Ответы (2)


Похоже, вы удалили не тот JAR. Сообщается об исходном ClassCastException, когда экземпляр SAXParserFactoryImpl (который является подтипом SAXParserFactory) приводится к SAXParserFactory.

Исключение, скорее всего, связано с тем, что в JVM загружаются два экземпляра SAXParserFactory, а не два экземпляра SAXParserFactoryImpl. Во время приведения SAXParserFactory, загруженный другим загрузчиком классов, был возвращен, что привело к исключению. Поэтому исправление состоит в том, чтобы идентифицировать файлы JAR в вашем пути к классам, которые имеют конфликтующие версии SAXParserFactory. Удаление самой реализации парсера может быть неразумным, если Commons Digester ищет конкретную реализацию.

person Vineet Reynolds    schedule 25.11.2010
comment
Раньше я удалил банку jaxp-ri-1.4.1.jar, которая выдала мне исключение NullPointerException. Теперь я удалил файл jaxp-api.jar. Я использовал jarfinder.com, чтобы узнать, в каких банках присутствует SaxParserFactory, и из всех банок у меня есть jaxp-api. - person Ozyman; 25.11.2010
comment
Я думаю, было бы неплохо проверить, как вы унаследовали эти JAR-файлы в своем проекте. Вам не нужна копия ни jaxp-ri-1.4.1.jar, ни jaxp-api.jar для разбора XML, особенно если вы используете Sun JDK. Сам JDK/JRE имеет необходимые API и реализацию синтаксического анализатора, которую можно использовать. В лучшем случае вам понадобится библиотека Xerces (только с необходимыми JAR-файлами), так как некоторые из JAR-файлов в дистрибутиве вызывают эту проблему (в частности, xml-apis.jar из Xerces 2.x). - person Vineet Reynolds; 25.11.2010
comment
Мы используем maven для нашего проекта. Значит, должен был включаться. Удивительно, но в pom.xml нет упоминания об этих банках. Наш проект — это проект веб-сервисов, поэтому я подумал, что они могут нам понадобиться для маршалинга. Я попробую посмотреть, что произойдет, когда я удалю файлы jaxp-*. Всем спасибо за советы... - person Ozyman; 25.11.2010
comment
Ах, тогда вы можете проверить, какие зависимости извлекаются Maven из-за включенных библиотек веб-сервисов. Я не уверен, что вы можете пометить соответствующие зависимости как зависимости времени выполнения, которые будут предоставлены контейнером в POM. Если ничего не помогает, подумайте о том, чтобы отделить свои веб-службы от действий Struts, возможно, в отдельный веб-модуль. - person Vineet Reynolds; 25.11.2010

Я предполагаю... Вы используете JBoss 5.1. Если это так, то это проблема с парсером xml и загрузкой классов. Вы должны определить jboss-classloading.xml

См. http://www.coderanch.com/t/523519/JBoss/Cast и http://www.mastertheboss.com/jboss-application-ser...oss-5-classloading-issues.html

person patrycja    schedule 02.08.2011
comment
Да, вероятно, это проблема с загрузчиком классов. - person João Fernandes; 02.08.2011
comment
И еще: использование jboss-classloading.xml просто и позволяет очень быстро решать наши проблемы, но иногда необходимо более тщательно проанализировать наше приложение. Мы должны убедиться, что это не конфликт между библиотеками и классами. Это нелегко, но если мы этого не сделаем, у нас могут возникнуть проблемы. Проблемы с загрузкой классов вызывают очень странные ошибки. Например. в моем случае я смог развернуть свое приложение как взорванную войну, но не как заархивированную войну. Что оказалось решением? Удаление jboss-classloading.xml и некоторых библиотек :) - person patrycja; 08.08.2011