2009-12-15 5 views
4

Nous avons une application déployée dans le serveur d'applications Websphere 7. Son déployé et fonctionnant dans divers environnements. Mais il a donné une méthode non trouvée exception dans un nouvel env. En creusant plus profondément, nous avons découvert qu'une classe particulière était présente dans 2 pots et que la classe du «mauvais» pot se chargeait dans le nouvel env. J'ai parcouru la vue détaillée du chargeur de classes et la séquence du chargement des pots était différente. Lors d'un examen plus approfondi, il semblait y avoir une variance aléatoire dans l'ordre dans lequel les fichiers jar étaient chargés dans chaque env.Websphere Classloading

2 questions:

1) Sur quel facteur La politique de chargement de classe WAS dépendent & toute suggestion pour remédier à ce problème?

2) Plus généralement, lorsque nous spécifions supposer * .jar dans le classpath pour un programme java, comment une JVM charge-t-elle les jars? Comme est-il alphabétique ou selon le temps modifié ou une telle propriété de fichier?

Répondre

8

Lors de l'installation web-apps sous WAS, vous pouvez définir la stratégie de classloading dans les options pour cette application (ou globalement sur le serveur/niveau de noeud)

Si les options politiques (recherche) « parent »/"parent last" et un chargeur de classe par application ou par guerre. La valeur par défaut est "parent first/war". Si votre application Web est fournie avec tous les fichiers jar dont elle a besoin, il est préférable de définir la règle "parent/application". Aussi, si vous éditez votre fichier web.xml pour refléter les changements, assurez-vous de définir "Utiliser la configuration binaire" sinon il utilisera toujours ce qu'il a stocké lors de l'installation.

+0

J'ai déjà effectué ces étapes. Le point de confusion est différent. Supposons que mon dossier lib Web-app contient 4 fichiers comme a.jar, b.jar, c.jar, d.jar, dans quel ordre ces 4 fichiers sont-ils chargés? J'espère que je me fais clair. Ce n'est pas le chargement de bocaux par rapport au serveur et à l'application. Plutôt l'ordre relatif de chargement des pots d'application. – Barun

+0

Si vous avez besoin d'une séquence spécifique, vous pouvez utiliser le paramètre classpath MANIFEST (je n'ai jamais fait cela mais les docs WAS le mentionnent.) 'WEB-INF/classes' est recherché avant les jars dans' WEB-INF/lib' peut extraire les classes dont vous avez besoin dans cet endroit. Une solution de contournement (à une situation indésirable) consiste à supprimer les classes offensives de '.jar' avant de le compresser dans le' .war' – rsp

+0

Hmm ...Les deux ont l'air un peu moche, mais son juste car c'est un problème moche. J'avais essayé la deuxième option. Il a donné plus de problèmes ... en raison d'un environnement de classe mélangé à l'exécution. Une idée sur quels facteurs dépend le chargement de ce pot? – Barun

1

Java charge les classes dans l'ordre où elles sont spécifiées dans le chemin de classe. Donc si votre classpath est "c: \ jar1.jar; c: \ jar2.jar" et jar1.jar et jar2.jar contiennent la même classe, la classe de jar1.jar sera toujours utilisée. Si la commande était inversée, la classe jar2.jar serait toujours utilisée.

Wikipédia explique comment Chargeuses classe assez bien travailler http://en.wikipedia.org/wiki/Java_Classloader

Le chemin de classe peut être configuré via la console d'administration WAS sur le serveur sous Serveur> Définition de processus> Java Virtual Machine

Il peut également être configuré par application .

+0

J'ai déjà effectué ces étapes. Le point de confusion est différent. Supposons que mon dossier lib Web-app contient 4 fichiers comme a.jar, b.jar, c.jar, d.jar, dans quel ordre ces 4 fichiers sont-ils chargés? J'espère que je me fais clair. Ce n'est pas le chargement de bocaux par rapport au serveur et à l'application. Plutôt l'ordre relatif de chargement des pots d'application. – Barun

+0

Gotcha, vous pouvez être en mesure de spécifier l'ordre pour le WAR en ajoutant un fichier MANIFEST.MF et en spécifiant l'attribut Class-Path là. Plus d'infos ici: http://java.sun.com/j2ee/verified/packaging.html –

0

Vous posez de très grandes questions. Pour résoudre votre problème, il êtes les 2 options:

  1. aller pour PARENT LAST, et ajouter quelque version de JARs vous devez classpath
  2. séjour avec PARENT FIRST, mais JARs rétrograder livré avec votre application pour correspondre à ce que WAS fournit.