26

我正在使用 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 扩展 - 我不知道为什么我会收到此错误。虽然我最终可以让我的项目运行,但如果我没有收到这个错误会更好。

谁能告诉我如何解决这个问题?我需要从我的项目库中删除此文件吗?我需要用新版本/旧版本更新这个文件吗?

4

2 回答 2

22

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

JAXP 是用于 XML 处理的 Java API。JAXP 对象(如解析器、XSLT 转换器、DOM 文档)的创建是通过工厂/工厂方法模式完成的,因此您可以插入新的 JAXP 实现(它必须比 JRE 中提供的更新)。Xerces 提供(部分)JAXP 实现并包含认可的标准(认可的标准是通过 Java 社区流程以外的标准流程定义的 Java API,请参阅认可的标准覆盖机制)。如果你不使用ESOM,你会遇到各种各样的麻烦。

于 2011-07-22T12:40:32.077 回答
0

将 Selenium 与 Glassfish 一起使用时出现此错误。我通过将 XML jars ( xerces-*, xalan-*, xml-apis*, serialize*) 从selenium/libs/to $AS_HOME/lib/endorsed(对于 Glassfish 2)或 to复制到$AS_HOME/glassfish/lib/endorsedGlassfish 4 来解决它。

于 2014-02-19T03:31:43.743 回答