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目录中,在该目录中安装了运行时软件。