Ошибка Xerces: org.апаш.xerces.impl.дифференциальный клапан.шаблон DTD.DTDDVFactoryImpl
Я разрабатываю веб-приложение с использованием JSF 2.0, NetBeans 6.9.1, GlassFish Server 3.1, mojarra 2.0.3 и JasperReports 3.7.6. В мою библиотеку проектов включен файл jar " xerces-2.8.0.сосуд." Этот файл был импортирован как часть библиотеки файлов Jar JasperReports. Всякий раз, когда я пытаюсь развернуть, запустить или отладить свой проект через NetBeans, я получаю эту ошибку:
java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! DTD factory class org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl does not extend from DTDDVFactory.
после любого изменения в моем проекте моя сборка завершается неудачей, и я получаю вышеуказанную ошибку при попытке развертывания, запустить или отладить его. Я должен перезапустить сервер и запустить/отладить во второй раз. Я искал в интернете и не могу найти решение этой проблемы. Я посмотрел на файл jar, о котором идет речь, и DTDDVFactoryImpl действительно простирается от DTDDVFactory - я не знаю, почему я получаю эту ошибку. Хотя я могу в конечном итоге запустить свой проект, было бы намного лучше, если бы я не получал эту ошибку.
кто-нибудь может сказать мне, как я могу это исправить? Нужно ли удалять этот файл из моей библиотеки проектов? Нужно ли обновлять этот файл с более новой версией / более старой версией?
2 ответов
Если вы предоставляете свои собственные xerces.jar, вы должны сделать это через одобренный механизм переопределения стандартов (java -Djava.endorsed.dirs=/path/to/xerces.jar
), вы не можете просто добавить его на пути к классам (и рано или поздно столкнетесь с проблемами, если вы это сделаете). Позвольте мне объяснить.
JAXP-это Java API для обработки XML. Создание объектов JAXP (таких как Парсеры, трансфомеры XSLT, документы DOM) выполняется через фабрика / фабрика-метод pattern таким образом, вы можете подключить новый JAXP реализация (она должна быть новее, чем та, которая предусмотрена в вашей JRE). Xerces обеспечивает (часть) реализацию JAXP и содержит одобренные стандарты (поддерживает стандарт - это API Java, определенный через процесс стандартов, отличный от процесса сообщества Java, см. Одобренный Механизм Переопределения Стандартов). Вы столкнетесь со всеми проблемами, если не будете использовать ESOM.
Я получил эту ошибку при использовании Селена с GlassFish. Я обошел его, скопировав XML-банки (xerces-*, xalan-*, xml-apis*, serialize*
) от selenium/libs/
to $AS_HOME/lib/endorsed
(для Glassfish 2) или к $AS_HOME/glassfish/lib/endorsed
для Glassfish 4.