XercesImpl est en conflit avec L'implémentation Xerces interne 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é est le suivant:
org.w3c.dom.Document dom; // declaration
javax.xml.validation.Schema schema; // declaration
...
...
...
javax.xml.validation.Validator validator = schema.newValidator();
validator.validate(new DOMSource(dom));
...
signifie code apparemment sans importance / non pertinent
compiler et exécuter le code avec JDK 6 fonctionne (et a toujours fonctionné...)
Récemment, j'ai dû intégrer dans mon code à un autre composant écrit ailleurs dans l'entreprise. Cette composante exige absolument l'inclusion dans le classpath xercesImpl-2.8.1.jar
j'ai absolument besoin de cette 3ème partie composante, mais maintenant l'exécution du code ci-dessus ne fonctionne plus et j'obtiens ce qui suit:
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 solution, j'ai pensé peut-être d'une façon ou d'une autre à protéger le xercesImpl-2.8.1.jar dans un classloader de ses propres, mais n'ont pas réussi à le faire, peut-être en raison du manque de connaissance classloader ou peut-être parce que ce n'est pas la voie à suivre. Encore une chose au sujet de mon environnement, mon application fonctionne sur tomcat 5.5 et 6...
par le chemin pendant le débogage, j'ai remarqué que quand je lance dom.getImplementation()
- lors de l'ajout
xercesImpl-2.8.1.jar
pour le chemin de classe le résultat estorg.apache.xerces.dom.DeferredDOMImplementationImpl@5f15c
- lors de sa suppression le résultat est
com.sun.org.apache.xerces.internal.dom.DeferredDOMImplementationImpl@6c6ae3
[Pas de surprise pour vous, lecteurs attentifs, je suppose]
des suggestions?
4 réponses
selon http://xml.apache.org/xalan-j/faq.html#faq-N100EF
Pour utiliser une version plus récente de Xalan-Java et de remplacer celui fourni avec les JDK:
utiliser le mécanisme approuvé de dérogation aux normes. Placez le xalan.jar, sérialiseur.jar, xercesImpl.jar et xml-apis.jar dans le répertoire\lib \ endorsed de la JRE, où est l'endroit où le logiciel d'exécution est installé
au Lieu d'utiliser:
// Uses first classloader-available implementation found:
//import javax.xml.validation.SchemaFactory;
SchemaFactory schemaFactory= SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
Essayez d'utiliser (Depuis la version 1.6 de Java):
// 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);
voir le JavaDoc correspondant.
Ou utiliser les META-INF/services d'ingénierie: article avec des exemples
J'espère que ça aide encore quelqu'un.
Gabriel
La première chose à essayer est de mettre la xerces pot dans le entériné répertoire. Cela conduira l'ensemble de la JVM à utiliser Xerces de manière cohérente. Cela pourrait résoudre tout le problème juste là, à moins qu'il y ait quelque chose de spécial au sujet de 2.8.1 que je ne sais pas.
notez Qu'il est possible d'endosser libs sans modifier jre en positionnant java.approuver.dirs propriété du système.
Voir Quelle est la façon exacte d'utiliser le répertoire approuvé dans jdk1.6.