2010-01-07 6 views
8

J'ai une ancienne application web fonctionnant sous Tomcat 5.0.Contrôlez l'ordre de classpath des jars dans WEB-INF/lib sur Tomcat 5?

Cette application web a deux pots dans WEB-INF/lib, disons Foo-2.0.jar et Bar-2.0.jar. Bar-2.0.jar inclut en fait un Foo-1.0.jar à l'intérieur. Bar est également un projet mort, ce qui signifie pas de mise à niveau, pas de source, mais toujours important pour l'application.

La dernière version de cette application nécessite Foo-2.0.jar pour d'autres choses. Ayant à la fois Foo-1.0.jar et Foo-2.0.jar dans le classpath crée un conflit, en particulier un ClassDefNotFound type d'erreur, où une classe qui a été ajouté plus tard dans la version 2.0 ne peut pas être trouvée dans 1,0, etc.

Dans Eclipse, la solution simple est à un clic droit sur votre projet , cliquez sur Propriétés >Java intégré Chemin>Ordre et l'exportation et de se déplacer Foo-2.0.jar ci-dessus Bar- 2.0.jar donc c'est résolu en premier.

Comment accomplir ce type de classpath ordering pour les pots dans WEB-INF/lib dans Tomcat?

Répondre

3

Mettez Foo-1.0.jar à $ CATALINE_HOME/common/endorsed (ou tout autre endroit où il sera chargé après Foo-2.0.jar).

1

Ce n'est pas le cas, car cette fonctionnalité n'est pas disponible dans Tomcat. Si à la fois Foo-1.0.jar et Foo-2.0.jar sont nécessaires dans le classpath en même temps, vous aurez besoin d'une réorganisation majeure de classpath. Si Bar-2.0 peut fonctionner avec Foo-2.0, alors la meilleure chose à faire serait de reconstruire Bar-2.0 sans Foo-1.0.jar.

+0

Il n'y a aucun moyen de savoir si Bar-2.0 fonctionne avec Foo-2.0 ou non, et c'est une bibliothèque massive, binaire seulement, sans cas de test. – rcampbell

+0

Je crois que la solution que vous utilisez a Bar-2.0 fonctionnant avec Foo-2.0, juste d'une manière détournée. – jsight

4

Bande Foo-1.0.jar sur Bar-2.0.jar. En l'état actuel des choses, il est difficile d'attendre à la fois pour le développement (nécessité de déformer les environnements de développement) et pour le déploiement.

+0

Je pense vraiment que c'est la meilleure suggestion. Remballez votre bar-2.0.jar, sinon vous ne demandez que des maux de tête sur la route. –

-2

Ceci est un peu hacky mais pourrait fonctionner. Changez le nom de Foo-2.0.jar pour qu'il soit en tête de Bar-2.0.jar, par exemple AFoo-2.0.jar.

32

Tomcat 5's classloading precedence pour webapps est à peu près comme suit: d'abord le bootstrap/système (JRE/lib, puis les classes internes de Tomcat), les bibliothèques webapp (premier WEB-INF/classes, puis WEB-INF/lib), les bibliothèques communes (premier Tomcat/common, puis Tomcat/lib) et enfin les bibliothèques webapp-shared (Tomcat/shared).

Donc, pour obtenir Foo-2.0.jar chargé avantBar-2.0.jar, mieux ce que vous pouvez faire est de déplacer Bar-2.0.jarWEB-INF/lib-Tomcat/common ou Tomcat/shared.

Les fichiers JAR ne sont pas chargés dans l'ordre alphabétique de leur nom. Au moins, il n'y a aucune spécification qui dit cela. Les renommer pour changer l'ordre alphabétique des noms de fichiers n'a aucun sens.

+0

Georgy a répondu en premier, donc j'ai accepté sa soumission, mais ce que vous décrivez est exactement ce que j'ai fait pour résoudre le problème. Votre lien a été particulièrement utile. ** J'encourage tout le monde à voter pour cette réponse **. – rcampbell

+1

De rien. Bien que je signale que les réponses ici sont ** pas ** par défaut ordonnées par date de réponse. Au moment de l'écriture, vous pouvez voir au verso de l'avatar utilisateur que j'ai répondu à cette question il y a 23 minutes et Georgy il y a 15 minutes. Vous pouvez modifier la commande par l'un des trois onglets 'plus vieux',' plus récent' et 'votes' en haut des réponses. La valeur par défaut est 'votes'. – BalusC

+1

Et, dans l'info-bulle, vous pouvez voir l'heure exacte. Donc, j'étais en fait d'abord: o – BalusC

Questions connexes