ÉTAIT de 6,1 java.lang.Exception verifyerror: chargement de classe contrainte violée

L'environnement a ÉTÉ 6.1 sur Linux, le déploiement d'une application web qui utilise
les classes de xercesImpl.jar.

En raison de la politique de l'entreprise restrictions, l'application doit être déployée
paramètres:

Class Loader Order
    Classes loaded with parent class loader first
->  Classes loaded with application class loader first

WAR class loader policy
    Class loader for each WAR file in application
->  Single class loader for application

La GUERRE de fichier contient une copie de xercesImpl.jar, le même que celui que
a été dans le classpath de l'application compilée.

Lors du lancement de la webapp, quand le Printemps essaie d'analyser ses configs, il
jette:

java.lang.VerifyError: class loading constraint violated 
    (class: org/apache/xerces/jaxp/DocumentBuilderImpl 
    method: parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;)

ANALYSE DE LA MESURE

Il semble que c'ÉTAIT fournit une implémentation de
org.apache.xerces.jaxp.DocumentBuilderImpl, parce que nous pouvons l'enlever
xercesImpl.jar à partir de la GUERRE de fichier et obtiens toujours la même erreur (pas de
ClassNotFoundException). Ainsi a ÉTÉ semble être la résolution de l'références
à l'aide de sa propre copie qui est incompatible avec les références dans notre
compilé les fichiers de classe. Cependant, le seul autre exemple de "xercesImpl.jar'
Je peux trouver (autres que la copie déployé avec notre app) est dans le répertoire
deploytool, qui semble être en dehors de l'application serveur.

J'ai scanné tous les pots en ÉTÉ (tous les 1300 d'entre eux) avec

for i in `find . -name \*.jar`; do jar tvf $i|grep -qi xerces && echo $i ; done

et a constaté que ./java/jre/lib/xml.jar contient toutes les classes dans org.apache.xerces.*,
donc c'est probable, où le chargeur de classe est la résolution de la référence.

VOICI L'ÉTRANGE PARTIE:

Si nous changeons de "chargeur de classe parent en premier", nous ne voyons pas l'exception.
Cela va à l'encontre du comportement attendu. Nous nous attendons à ce que, avec
"l'application du chargeur de classe de première" elle serait d'utiliser la xercesImpl.jar que nous
à condition, et l'utilisation EST la version que si nous ensemble "chargeur de classe parent
d'abord". Cela semble être vers l'arrière à partir de ce que nous voyons réellement.

LA QUESTION:

Comment est le chargeur de classe délégation paramètre d'interagir avec les informations ci-dessus entraînera le comportement observé?

Cela sonne bien. Si je vous comprends, le problème n'est pas DocumentBuilderImpl, mais le fait qu'il est en train d'être résolu à partir du JDK alors que l'une des classes les références se retrouve dans la GUERRE. Cela n'explique pas pourquoi, lorsque nous incluons xercesImpl.jar dans la GUERRE, on obtient exactement la même erreur, citant la même méthode et les noms de classe. Dites-vous que la méthode et les noms de classe cité dans le message ne sont pas pertinents pour le problème?

OriginalL'auteur Jim Garrison | 2010-05-18