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

XercesImpl与JavaSE 6'冲突;的内部xerces实现。两者都是需要的。。。可以做些什么?,java,xml,validation,xerces,jdk1.6,Java,Xml,Validation,Xerces,Jdk1.6,我相信我不是第一个遇到这种冲突的人 我继承的代码执行以下操作: org.w3c.dom.Document dom; // declaration javax.xml.validation.Schema schema; // declaration ... ... ... javax.xml.validation.Validator validator = schema.newValidator(); validator.validate(new DOMSource(dom)); org.x

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

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

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

...
...
...

javax.xml.validation.Validator validator = schema.newValidator();
validator.validate(new DOMSource(dom));
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)
其中,
代表看似不重要/不相关的代码

用JDK 6编译和运行代码是可行的(而且总是有…)

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

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

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

...
...
...

javax.xml.validation.Validator validator = schema.newValidator();
validator.validate(new DOMSource(dom));
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
[我想你们细心的读者不会感到惊讶]


有什么建议吗?

首先要尝试的是将xerces jar放在认可的目录中。这将导致整个JVM一致地使用Xerces。这可能就解决了整个问题,除非我不知道2.8.1有什么特别之处。

根据

要使用较新版本的Xalan Java并覆盖随JDK打包的版本,请执行以下操作:

。将xalan.jar、serializer.jar、xercesImpl.jar和xml-api.jar放在JRE的\lib\approved目录中,在那里安装运行时软件,而不是使用:

// Uses first classloader-available implementation found:
//import javax.xml.validation.SchemaFactory;
SchemaFactory schemaFactory= SchemaFactory.newInstance(
    XMLConstants.W3C_XML_SCHEMA_NS_URI);
尝试使用(从Java 1.6开始):

请参阅相关的JavaDoc

或者使用META-INF/服务工程:

希望它还能帮助别人


Gabriel

注意,通过设置系统属性,可以在不修改jre的情况下认可LIB


请参阅。

您是指jdk认可的库还是tomcat的库?我在考虑jdk,但您可以先试试tomcat的库,看看它是否有帮助。我完全按照您指定的那样做,但仍然存在冲突。我想,由于在添加第三方组件之前出现的代码使用了JDK中的旧API…@Yaneeve-我想您已经回答了自己的问题。您将需要修改代码以使用其中一种,我将使用JDK附带的代码。也许如果你在每个模块中完全限定你的课程,这可能会起作用?我会放弃你添加的Xercesimpl,让它发挥作用。