52 votes

La gestion de bibliothèques dans tomcat

J'ai deux applications sous tomcat/webapps dossier.

tomcat/webapps/App1 et tomcat/webapps/App2
les deux applications partagent les mêmes bibliothèques. Qui sont financée par exemple dans tomcat/webapps/App1/WEB-INF/lib.

Sont les mêmes bibliothèques chargé à deux reprises sur la mémoire?

Dois-je mettre ces bibliothèques partagées dans tomcat/server/lib?

Merci pour les commentaires

SOLUTION

Si vous ne voulez pas que vos bibliothèques de charger deux fois de les mettre dans:

  • Tomcat 6 $CATALINA_HOME/lib
  • Tomcat 5 $CATALINA_HOME/common/lib

41voto

romaintaz Points 32120

Comme vous pouvez le voir ici, Tomcat crée une classe loader par webapp sur votre serveur. Ainsi, si vous avez webapp1 et webapp2 qui partagent la même bibliothèque, puis cette bibliothèque sera en effet chargé à deux reprises.

Vous pouvez éventuellement mettre cette bibliothèque dans le répertoire commun (tomcat-dir/common/lib) si elle est partagée par tous les webapps qui s'exécutent sur votre serveur Tomcat.

29voto

kgiannakakis Points 62727

Je ne recommanderais pas de placer les fichiers jar dans le dossier partagé. Par exemple, disons que vous avez besoin à l'avenir pour déployer une application tierce, qui a une version plus récente d'un fichier jar dans le dossier WEB-INF. Pour cette application, les classes du pot sera chargé à deux reprises (même si elles portent le même nom), l'un à partir du dossier partagé et un sur le web dossier app. Cette situation peut provoquer des bugs très difficile à trouver.

Si les fichiers jar sont, dans l'application web des dossiers, alors qu'ils sont chargés par catégorie distincte des chargeurs et n'interfèrent pas les uns avec les autres.

8voto

iAn Points 3090

De l'expérience: les deux web-apps sont complètement isolées l'une de l'autre - les bibliothèques de l'un ne sont pas utilisées dans un autre - c'est donc pour répondre à votre question initiale - oui, ce serait chargé à deux reprises.

Pour vous répondre à la deuxième question, à savoir si vous devez déployer ces bibliothèques dans Tomcat répertoire partagé - je dirais non, et voici pourquoi:

Si vous déployez une bibliothèque Jar dans le répertoire partagé (tomcat/server/lib), alors que la version de la bibliothèque devient la valeur par défaut pour toutes les applications en cours d'exécution en vertu de cette instance de Tomcat. Comme vous pouvez le voir à partir de cette vue d'ensemble de l'tomcat de l'architecture, de la catégorie-chargeur fonctionne "en bas de la chaîne", avec une personne de la web-app du dossier lib être le dernier endroit où il avant de, il jette une classe-pas-trouvé exception. Ce n'est pas vrai dans Tomcat Tomcat 6 et 7: les classes du web apps lib et dossier classes vont être résolus avant que ceux en commun, et donc, ce ne sera pas briser autres applications à déployer tous leurs pots dans la guerre 2.

Le problème, par conséquent, de déploiement d'une bibliothèque partagée pour ce répertoire est qu'elle casse l'architecture pour les applications individuelles étant isolés l'un de l'autre. Bien dans votre premier exemple, mais si vous souhaitez déployer une application tierce (par exemple, si vous exécutez une application qui consomme du Portlet pour gérer le contenu spécifique), vous lancez instantanément à la version problèmes de dépendances - votre version partagée de la bibliothèque peut ne pas être correcte pour l'application tierce, mais parce que le paquet est déjà chargé, vous pourrez lancer des exceptions à gauche de la droite et du centre.

6voto

Toni Bünter Points 1

Nous sommes à l'aide de tomcat6 et trouver un bon moyen de tomcat en peluche avec des bibliothèques communes à tous nos webapps besoin.

Modifier dans conf/catalina.les propriétés de l'entrée de la commune.loader. E. g. ajouter un dossier avec des bocaux que vous souhaitez partager 'mylibs'

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,
              ${catalina.home}/lib,${catalina.home}/lib/*.jar,
              {catalina.home}/mylibs/*.jar

Alors mettez toutes les bibliothèques il. Fait.

Pourquoi avons-nous commencé à l'aide d'un mylibs dossier à la place de la WEB-INF/lib dans toutes les webapps (la GUERRE des fichiers)?

Le déploiement a commencé à être un cauchemar après la GUERRE traversé la 50MO ligne!

Quand on a une webapp avec un jamais jar version, vous pouvez toujours le mettre dans WEB-INF/lib de remplacer ce que vous avez dans mylibs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X