XercesImpl находится в конфликте с внутренней реализацией JavaSE 6 xerces. Оба нужны ... что можно сделать? - PullRequest
11 голосов
/ 24 июня 2010

Я уверен, что я не первый, кто столкнулся с этим конфликтом.

Код, который я унаследовал, делает следующее:

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 работает (и всегда имел ...)

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

[Не удивительно, внимательные читатели, я полагаю]

Есть предложения?

Ответы [ 4 ]

7 голосов
/ 26 августа 2011

Вместо использования:

// 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 /сервисная инженерия: статья с примерами

Надеюсь, это кому-нибудь еще поможет.

Габриэль

6 голосов
/ 24 июня 2010

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

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

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

2 голосов
/ 09 октября 2013

Обратите внимание, что можно поддержать libs без изменения jre, установив java.endorsed.dirs системное свойство.

См. , как именно использовать директорию Endorsed в jdk1.6 .

.
2 голосов
/ 24 июня 2010

Первое, что нужно попробовать - это поместить jerces jar в одобренный каталог.Это заставит всю JVM последовательно использовать Xerces.Это может решить всю проблему, если только в 2.8.1 нет ничего особенного, о чем я не знаю.

...