XercesImpl est en conflit avec l'implémentation interne de xerces de JavaSE 6. Les deux sont nécessaires ... que peut-on faire?

Je suis sûr que je ne suis pas le premier à rencontrer ce conflit.

Le code que j'ai hérité effectue les opérations suivantes:

org.w3c.dom.Document dom; //declaration
javax.xml.validation.Schema schema; //declaration

...
...
...

javax.xml.validation.Validator validator = schema.newValidator();
validator.validate(new DOMSource(dom));

où la ... signifie apparemment sans importance/pertinence code

De la compilation et de l'exécution du code avec le JDK 6 fonctionne toujours (...)

Récemment, j'ai dû intégrer dans mon code à un autre composant écrit ailleurs dans l'entreprise. Ce composant nécessite absolument l'inclusion dans le classpath de xercesImpl-2.8.1.jar

J'ai absolument besoin de cette 3ème partie composante, mais maintenant en cours d'exécution du code ci-dessus ne fonctionne plus et je reçois le texte suivant:

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)

Comme une solution, j'ai pensé peut-être à une sorte de bouclier de la xercesImpl-2.8.1.jar dans un chargeur de classe de son propre, mais n'ont pas réussi à le faire, peut-être en raison du manque de classloader connaissances ou peut-être parce que ce n'est pas le chemin à parcourir. Encore une chose à propos de mon environnement, mon application s'exécute sur le serveur tomcat 5.5 et 6...

par la voie pendant le débogage, j'ai remarqué que quand je lance dom.getImplementation()

  • lors de l'ajout de l'
    xercesImpl-2.8.1.jar à l'
    chemin de classe le résultat est
    org.apache.xerces.dom.DeferredDOMImplementationImpl@5f15c
  • lorsque vous le retirez, le résultat est com.sun.org.apache.xerces.internal.dom.DeferredDOMImplementationImpl@6c6ae3

[Pas de surprise pour vous, lecteurs attentifs, je suppose]

Des suggestions?

source d'informationauteur Yaneeve