gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:23:42 24 4
gpt4 key购买 nike

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

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

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

[我想细心的读者不会感到惊讶]

有什么建议吗?

最佳答案

而不是使用:

// 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/服务工程:article with examples

希望它仍然对某些人有帮助。

加布里埃尔

关于java - XercesImpl 与 JavaSE 6 的内部 xerces 实现冲突。两者都需要......可以做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3110258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com