XercesImpl与JavaSE 6的内部xerces实现冲突。两者都需要...可以做什么?


问题内容

我确信我不是第一个遇到这种冲突的人。

我继承的代码执行以下操作:

org.w3c.dom.Document dom; // declaration
javax.xml.validation.Schema schema; // declaration

...
...
...

javax.xml.validation.Validator validator = schema.newValidator();
validator.validate(new DOMSource(dom));

...看似无关紧要的代码所在的位置

使用JDK 6可以编译和运行代码(并且一直都有…)

最近,我不得不将公司中其他地方编写的另一个组件集成到我的代码中。该组件绝对需要在以下文件的类路径中包含xercesImpl-2.8.1.jar

我绝对需要这个第3方组件, 但是 现在运行上面的代码不再起作用,我得到以下信息:

org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'Root'.
 at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
 at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
 at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
 at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
 at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
 at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
 at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
 at org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
 at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
 at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
 at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
 at javax.xml.validation.Validator.validate(Validator.java:127)

作为一种解决方案,我认为可能以某种方式在自己的类加载器中屏蔽了xercesImpl-2.8.1.jar,但由于缺少类加载器的知识或可能由于其不可行而未能做到这一点。关于我的环境的另一件事,我的应用程序在Tomcat
5.5和6上运行…

顺便说一下,在调试时,我注意到当我运行 dom.getImplementation()

  • 当添加 xercesImpl-2.8.1.jar到类路径时,结果是 org.apache.xerces.dom.DeferredDOMImplementationImpl@5f15c
  • 当删除它的结果是 com.sun.org.apache.xerces.internal.dom.DeferredDOMImplementationImpl@6c6ae3

[我想细心的读者对您来说并不奇怪]

有什么建议?


问题答案:

根据http://xml.apache.org/xalan-j/faq.html#faq-N100EF

要使用Xalan-Java的较新版本并覆盖JDK附带的版本,请执行以下操作:

使用认可标准替代机制。将xalan.jar,serializer.jar,xercesImpl.jar和xml-
apis.jar放在JRE的\ lib \ endorsed目录中,在该目录中安装了运行时软件。