XercesImpl находится в конфликте с внутренней реализацией xerces JavaSE 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));

здесь ... означает, казалось бы, неважный / нерелевантный код

компиляция и запуск кода с помощью JDK 6 работает (и всегда работал...)

недавно мне пришлось интегрировать в мой код другой компонент, написанный в другом месте в компании. Этот компонент абсолютно требует включения в класса xercesImpl-2.8.1.jar

мне абсолютно необходим этот компонент 3rd party,но теперь работает приведенный выше код не работает и я получаю следующее:

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 в classloader самостоятельно, но не удалось сделать это, возможно, из-за отсутствия знаний classloader или, возможно, потому, что это не путь. Еще одна вещь о моей среде, мое приложение работает на 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

[не удивит внимательного читателя небось]

какие предложения?

4 ответов


согласно http://xml.apache.org/xalan-j/faq.html#faq-N100EF

чтобы использовать более новую версию Xalan-Java и переопределить ту, которая упакована с JDK:

используйте одобренный механизм переопределения стандартов. Поместите xalan.банка, сериализатор.jar, xercesImpl.jar и xml-API.jar в каталоге \lib\endorsed JRE, где установлено программное обеспечение среды выполнения


вместо:

// 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 в одобренный каталог. Это заставит весь JVM использовать Xerces последовательно. Это может решить всю проблему прямо там, если нет чего-то особенного в 2.8.1, о котором я не знаю.


обратите внимание, что можно одобрить libs без изменения jre, установив java.одобренный.Дирс!--2--> системное свойство.

посмотреть каков точный способ использования одобренного каталога в jdk1.6.