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

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

我inheritance的代码执行以下操作:

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的类路径中

我绝对需要这个第三方组件, 现在运行上面的代码不再有效,我得到以下内容:

 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目录中,运行时软件的安装位置在这里

而不是使用:

 // Uses first classloader-available implementation found: //import javax.xml.validation.SchemaFactory; SchemaFactory schemaFactory= SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI); 

尝试使用(自Java 1.6起):

 // Uses org.apache.xerces.jaxp.validation.XMLSchemaFactory subclass //of SchemaFactory as implementation: //import javax.xml.validation.SchemaFactory; SchemaFactory schemaFactory= SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI, "org.apache.xerces.jaxp.validation.XMLSchemaFactory", null); 

请参阅相关的JavaDoc。

或者使用META-INF /服务工程: 带有示例的文章

希望它仍然有助于某人。

加布里埃尔

首先要尝试的是将xerces jar放在endorsed目录中。 这将导致整个JVM始终如一地使用Xerces。 这可能解决了整个问题,除非有一些特别的关于2.8.1我不知道。

请注意,通过设置java.endorsed.dirs系统属性,可以在不修改jre的情况下支持lib。

看看在jdk1.6中使用Endorsed目录的确切方法是什么 。