Tomcat charge-t-il le même fichier de bibliothèque en mémoire deux fois s’il se trouve dans deux applications Web?

J’ai deux applications sous le dossier tomcat/webapps .

 tomcat/webapps/App1 tomcat/webapps/App2 

Les deux applications partagent les mêmes bibliothèques. Qui sont stockés par exemple dans tomcat/webapps/App1/WEB-INF/lib .

Les deux bibliothèques sont-elles chargées deux fois en mémoire?

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

Comme vous pouvez le voir ici , Tomcat crée un chargeur de classe par application Web sur votre serveur. Ainsi, si webapp1 et webapp2 partagent la même bibliothèque, cette bibliothèque sera chargée deux fois.

Vous pouvez éventuellement placer cette bibliothèque dans le répertoire commun (répertoire tomcat / common / lib) si elle est partagée par toutes les applications Web exécutées sur votre serveur Tomcat.

Je ne recommanderais pas de placer les fichiers jar dans le dossier partagé. Supposons par exemple que vous ayez besoin, à l’avenir, de déployer une application tierce dotée d’une version plus récente d’un fichier JAR dans le dossier WEB-INF. Pour cette application, les classes du fichier jar seront chargées deux fois (même si elles portent le même nom), une du dossier partagé et une du dossier de l’application Web. Cette situation peut causer des bugs très difficiles à trouver.

Si les fichiers jar se trouvent dans les dossiers de l’application Web, ils sont chargés par des chargeurs de classes distincts et n’interfèrent pas les uns avec les autres.

Par expérience: les deux applications Web sont complètement isolées les unes des autres – les bibliothèques pour l’une ne sont pas utilisées dans une autre – donc pour répondre à votre question initiale – oui, elles seraient chargées deux fois.

Pour répondre à votre seconde question, vous devriez déployer ces bibliothèques dans le répertoire partagé de Tomcat – je dirais non et voici pourquoi:

Si vous déployez une bibliothèque Jar dans l’emplacement partagé (tomcat / server / lib), cette version de la bibliothèque devient la version par défaut de toutes les applications Web exécutées sous cette instance de Tomcat. Comme vous pouvez le voir dans cette vue d’ensemble de l’architecture tomcat , le chargeur de classes fonctionne «en bout de chaîne», le dossier lib de chaque application Web étant le dernier endroit où il se présentera avant de lancer une exception de classe. Ce n’est pas le cas dans Tomcat 6 et Tomcat 7: toutes les classes dans le dossier des applications Web et des classes seront résolues avant celles en commun, ce qui ne brisera pas les autres applications qui déploient tous leurs fichiers JAR 2 .

Le problème est donc de déployer une bibliothèque partagée dans ce répertoire en brisant l’architecture pour les applications individuelles isolées les unes des autres. Bien dans votre exemple initial, mais si vous souhaitez déployer une application tierce (par exemple, si vous exécutez une application qui utilise des portlets pour gérer un contenu spécifique), vous rencontrez instantanément des problèmes de dépendance de version – votre version partagée d’une bibliothèque peut ne pas être correct pour l’application tierce, mais parce que le package est déjà chargé, vous allez lancer des exceptions à droite et au centre.

Nous utilisons tomcat6 et trouvons un bon moyen de faire en sorte que tomcat soit rempli de bibliothèques communes dont toutes nos applications Web ont besoin.

Modifiez dans conf / catalina.properties l’entrée common.loader . Ajoutez par exemple un dossier supplémentaire contenant des jars 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 

Ensuite, mettez toutes les bibliothèques communes là-bas. Terminé.

Pourquoi avons-nous commencé à utiliser un dossier mylibs au lieu de WEB-INF / lib dans toutes les applications Web (fichiers WAR)?

Le déploiement a commencé à être un cauchemar après que la guerre ait franchi la ligne des 50 Mo!

Lorsque vous avez une application Web avec une version jamais jar, vous pouvez toujours la mettre dans WEB-INF / lib pour écraser ce que vous avez dans mylibs .

Si vous ne voulez pas que vos bibliothèques se chargent deux fois, placez-les dans:

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

(retiré de la question et copié ici pour qu’il puisse être voté / commenté)

PermGen Space de tas est utilisé pour stocker des classes et des métadonnées sur les classes en Java.

Erreur java.lang.OutOfMemoryError: L’espace PermGen peut se produire fréquemment car nous chargeons beaucoup de bibliothèques dupliquées dans apache tomcat.