2010-06-24 4 views
10

Я уверен, что я не первый, кто столкнулся с этим конфликтом.XercesImpl противоречит реализации внутренних ксероксов 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

я абсолютно требую этого 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 к классам результат [email protected]
  • при удалении его результат является com.s[email protected]6c6ae3

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

Любые предложения?

ответ

6

В соответствии с http://xml.apache.org/xalan-j/faq.html#faq-N100EF

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

use the Endorsed Standards Override Mechanism. Поместите xalan.jar, serializer.jar, xercesImpl.jar и XML-apis.jar в \ Lib \ одобренным каталог JRE, где, где установлен

+0

Я сделал точно так же, как вы указали еще конфликт. Думаю, поскольку код, присутствующий до добавления стороннего компонента, использует старый API, найденный в JDK ... – Yaneeve

+1

@Yaneeve - Думаю, вы ответили на свой вопрос. Вам понадобится изменить свой код, чтобы использовать тот или иной, я бы пошел с тем, который поставляется с JDK. Может быть, если вы полностью квалифицируете свои классы в каждом модуле, который может работать? Я хотел бы избавиться от добавленного вами Xercesimpl и просто заставить его работать. –

+0

Я думаю, что это то, что я должен сделать ... – Yaneeve

2

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

+0

Вы имеете в виду одобренную библиотеку jdk или tomcat? – Yaneeve

+0

Я думал о JDK, но вы можете попробовать tomcat в первую очередь и посмотреть, помогает ли это. – Yishai

7

Вместо программного обеспечения во время выполнения с помощью:

// 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

Надежда это еще помогает кому-то.

Gabriel

 Смежные вопросы

  • Нет связанных вопросов^_^