8
votes

Contrôlez le commandement de la classe de classe des pots dans Web-Inf / Lib sur Tomcat 5?

J'ai une application Web héritée en cours d'exécution à Tomcat 5.0.

Cette application Web a deux pots dans web-inf / lib , disons foo-2.0.jar et bar-2.0.jar . bar-2.0.jar comprend en fait un FOO-1.0.jar à l'intérieur de celui-ci. Bar est également un projet mort, ce qui signifie aucune mise à niveau, aucune source, mais toujours importante pour l'application.

La dernière version de cette application nécessite foo-2.0.jar pour d'autres choses. Avoir les deux foo-1.0.jar et foo-2.0.jar dans la classe de classe crée un conflit, en particulier un classdefnotfound type d'erreur, où un La classe qui a été ajoutée ultérieurement en 2.0 ne peut pas être trouvée dans 1.0, etc.

Dans Eclipse, la solution simple est de cliquer avec le bouton droit de la souris sur votre Projet , cliquez sur Propriétés > piste construit Java > commande et Exporter et déplacer foo-2.0.jar ci-dessus bar-2.0.jar il est donc résolu en premier.

Comment accomplir ce type de classe de classe de classe pour des pots dans web-inf / lib à tomcat?


0 commentaires

7 Réponses :


1
votes

Vous ne le faites pas, car cette fonctionnalité n'est pas disponible à Tomcat. Si FOO-1.0.JAR et FOO-2.0.JAR sont nécessaires dans le type de classe en même temps, vous aurez besoin de la réorganisation majeure de la classe de classe.

Si BAR-2.0 peut fonctionner avec FOO-2.0, alors la meilleure chose à faire serait de reconstruire la barre-2.0 vous-même sans foo-1.0.jar à l'intérieur de celui-ci.


2 commentaires

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 et binaire sans cas de test.


Je crois que la solution que vous utilisez a la barre 2.0 en cours d'exécution avec FOO-2.0, juste d'une sorte de rond-point.



4
votes

bande foo-1.0.jar hors bar-2.0.jar . Comme c'est vrai, il suffit de difficulté à attendre pour le développement (besoin de fudger les environnements de développement) et pour le déploiement.


1 commentaires

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



0
votes

Il est possible de définir la parcelle de classe dans la pêche principale du pot. http://java.sun.com/developer/books/ JavaProgrammation / Jar / Basics / Manifeste.HTML Je ne peux pas vraiment promettre que cela résoudra le problème, mais je peux valoir la peine d'essayer.


0 commentaires

-2
votes

C'est un peu hacky mais pourrait fonctionner. Changez le nom de FOO-2.0.JAR pour être alphabétiquement en avance sur la bar-2.0.jar, dites AFOO-2.0.JAR.


0 commentaires

33
votes

La précision de la classe de classement de Tomcat 5 pour WebApps est grossièrement comme suit: d'abord le bootstrap / system ( jre / lib , puis les classes internes de Tomcat), puis les bibliothèques WebApp (premier web-inf / classes , puis Web -Inf / lib ), alors les bibliothèques communes (premier tomcat / commun , alors tomcat / lib ) et enfin les bibliothèques partagées WebApp ( Tomcat / partagé ).

afin d'obtenir foo-2.0.jar chargé avant bar-2.0.jar , meilleur ce que vous pouvez faire est de déplacer Bar-2.0.jar à partir de web-inf / lib à tomcat / commun ou tomcat / partagé . .

Le pot n'est pas chargé dans l'ordre alphabétique de leur nom. Au moins, il n'y a pas de spécification qui dit cela. Les renommer pour changer la commande de nom de fichier alphabétique n'a aucun sens.


4 commentaires

Georgy a répondu en premier, alors 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 était particulièrement utile. J'encourage tout le monde à voter cette réponse .


Je vous en prie. Bien que je signale que les réponses ici sont pas par défaut commandées par la date de réponse. Au moment de la rédaction, vous pouvez voir à la topre de l'utilisateur Avatar 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 Oilest , le plus récent et votes droite des réponses. La valeur par défaut est votes .


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


Chargeuse de classe Comment pour Tomcat 8 Tomcat.apache.org/ Tomcat-8.0-Doc / Class-Loader-Howto.html



3
votes

mettre foo-1.0.jar à $ cataline_home / commun / endossé (ou tout autre endroit où il sera chargé après FOO-2.0.jar).


0 commentaires

0
votes

avoir FOO-2.0.JAR avant la barre-2.0.jar, mettez à jour la barre-2.0.jar avec le contenu de FOO-2.0.jar (écraser déjà contenue .Class) et supprimer FOO-2.0.jar de la guerre .

-cp A.jar: B.jar a l'effet que la teneur en A.jar est comme une couche sur B.jar. Donc, vous obtenez le même effet avec le contenu de B.jar avec A.jar.


0 commentaires