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

时间:2011-01-18 23:08:18

标签: jsf glassfish jasper-reports xerces

我正在使用JSF 2.0,NetBeans 6.9.1,GlassFish Server 3.1,mojarra 2.0.3和JasperReports 3.7.6开发Web应用程序。我的项目库中包含jar文件“xerces-2.8.0.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扩展 - 我不知道为什么我收到此错误。虽然我最终可以让我的项目运行,但如果我没有收到此错误会更好。

任何人都可以告诉我如何解决这个问题?我是否需要从项目库中删除此文件?我是否需要使用较新版本/旧版本更新此文件?

2 个答案:

答案 0 :(得分:22)

如果您提供自己的xerces.jar,则必须通过Endorsed Standards Override Mechanism(java -Djava.endorsed.dirs=/path/to/xerces.jar)来执行此操作,不允许将其添加到类路径中(并且迟早会遇到如果你这样做会有麻烦)。让我解释一下。

JAXP是Java API for XML Processing。 JAXP对象(如解析器,XSLT transfomers,DOM Documents)的创建是通过factory/factory-method pattern完成的,因此您可以插入一个新的JAXP实现(它必须比JRE中提供的更新)。 Xerces提供(部分)JAXP实现并包含认可的标准(认可的标准是通过除Java Community Process之外的标准流程定义的Java API,请参阅Endorsed Standards Override Mechanism)。如果你不使用ESOM,你将遇到各种各样的麻烦。

答案 1 :(得分:0)

使用Selenium和Glassfish时出现此错误。我通过将XML jar(xerces-*, xalan-*, xml-apis*, serialize*)从selenium/libs/复制到$AS_HOME/lib/endorsed(对于Glassfish 2)或者对于Glassfish 4复制到$AS_HOME/glassfish/lib/endorsed来解决这个问题。