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
Vous devez vous connecter pour publier un commentaire.
Comme par http://xml.apache.org/xalan-j/faq.html#faq-N100EF
À utiliser une version plus récente de Xalan-Java et de remplacer celui fourni avec les JDK:
utilisez le a Approuvé les Normes de Remplacer le Mécanisme de. Place de la xalan.jar, serializer.jar, xercesImpl.jar et xml-apis.jar dans le \lib\approuvé répertoire de la JRE, où est l'endroit où le logiciel runtime est installé
Au lieu d'utiliser:
Essayez d'utiliser (Depuis la version 1.6 de Java):
Reportez-vous à la JavaDoc.
Ou utiliser les META-INF/services d'ingénierie: article avec des exemples
Espère que ça aide toujours de quelqu'un.
Gabriel
La première chose à essayer est de mettre la xerces pot dans le entériné répertoire. Qui sera la cause de l'ensemble de la JVM à utiliser Xerces de manière cohérente. Qui peut résoudre l'ensemble du problème, à moins qu'il y est quelque chose de spécial à propos de 2.8.1 je ne sais pas.
Notez qu'il est possible d'approuver libs sans modifier jre par la mise en java.approuvé.dirs système de la propriété.
Voir qu'est-ce que la manière exacte de l'utilisation Approuvé répertoire dans jdk1.6.