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 est org.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?

10
demandé sur Yaneeve 2010-06-24 17:17:46

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é

6
répondu Romain Hippeau 2010-06-24 17:57:52

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

7
répondu Gabriel 2012-09-26 08:40:43

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.

2
répondu Yishai 2010-06-24 13:25:21

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.

2
répondu Vadzim 2017-05-23 11:58:20