Я уверен, что не являюсь первым для обнаружения с этим конфликтом.
Код, который я наследовал, делает следующее:
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 в classloader собственном, но не сумел сделать так, возможно, из-за отсутствия classloader знаний или возможно потому что не способ пойти. Еще одна вещь о моей среде, моем выполнении приложения на коте 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 в каталог \lib\endorsed в JRE, где установлено программное обеспечение среды выполнения
.Первое, что можно попробовать, это поместить xerces jar в каталог endorsed. Это заставит всю JVM последовательно использовать Xerces. Это может решить всю проблему, если только нет чего-то особенного в 2.8.1, о чем я не знаю.