Xerces错误:org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl

27

我正在使用JSF 2.0、NetBeans 6.9.1、GlassFish Server 3.1、mojarra 2.0.3和JasperReports 3.7.6开发Web应用程序。在我的项目库中包含了" xerces-2.8.0.jar "的jar文件。这个文件是作为JasperReports jar文件库的一部分导入的。每当我尝试通过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,但我不知道为什么会收到这个错误。虽然最终可以使项目运行起来,但如果不再收到这个错误会更好。

请问有人能告诉我如何修复这个问题吗?我需要从我的项目库中删除该文件吗?我需要更新此文件以使用更新的版本/旧版本吗?


1
我没有。我以为我已经搞清楚了。项目中有多个Xerxes jar文件。我以为删除冗余的一个就可以解决问题。但是我错了。它仍然经常给我这个错误。 - Sean
2个回答

22
如果您提供自己的xerces.jar,则必须通过认可标准覆盖机制(java -Djava.endorsed.dirs=/path/to/xerces.jar)进行操作,不允许将其添加到类路径中(如果这样做,迟早会遇到问题)。让我解释一下。
JAXP是Java API for XML Processing。创建JAXP对象(如解析器、XSLT转换器、DOM文档)是通过factory/factory-method pattern完成的,因此您可以插入新的JAXP实现(必须比JRE提供的版本更新)。Xerces提供了JAXP实现的一部分,并包含认可标准(Endorsed Standards Override Mechanism定义了除Java社区流程之外的标准过程定义的Java API)。如果不使用ESOM,您将遇到各种问题。

0
当我使用Selenium和Glassfish时,我遇到了这个错误。我通过将XML jars (xerces-*, xalan-*, xml-apis*, serialize*) 从 selenium/libs/ 复制到 $AS_HOME/lib/endorsed (适用于Glassfish 2) 或者复制到 $AS_HOME/glassfish/lib/endorsed (适用于Glassfish 4) 来解决它。

我有一个类似的问题。我在我的WebLogic应用程序中添加了一些额外的Spring内容(消息驱动POJO),现在我遇到了这个错误。WL 10.3.4,Spring 3.0.5。(是的,我知道Spring至少应该升级到3.2.10。我希望在升级Spring之前进行更改。) - Brett Slocum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接