ClassLoader et Web applications

Pour ceux qui se demanderaient comment un serveur d'application fait pour gérer deux versions différentes de la même classe java utilisées par deux applications web tournant sur la même JVM...

En fait, la spécification servlet précise des règles strictes qu'un serveur d'application doit vérifier, par exemple dans la norme servlet 2.3, il est précisé que :

  • le classloader utilisé pour lire un war doit autoriser l'accès à tous les jars de librairie dans ce war via getResource mais ne doit pas autoriser de remplacer l'implantation J2SE ou les classes servlet.
  • qu'il est recommandé que ce classloader ne puisse pas accéder aux classes d'implantation du web container
  • qu'il est recommandé également que les ressources définies dans le war soient chargées prioritairement sur celles définies par le web container.

The classloader that a container uses to load a servlet in a WAR must allow the
developer to load any resources contained in library JARs within the WAR
following normal J2SE semantics using getResource. It must not allow theWAR to
override J2SE or Java servlet API classes. It is further recommended that the loader
not allow servlets in theWAR access to the web container’s implementation classes.
It is recommended also that the application class loader be implemented so
that classes and resources packaged within the WAR are loaded in preference to
classes and resources residing in container-wide library JARs.

Il est ensuite précisé que le classloader doit d'abord charger les classes dans WEB-INFclasses puis celles des librairies (dans WEB-INF/lib) :

The web application classloader must load classes from the WEB-INF/ classes
directory first, and then from library JARs in the WEB-INF/lib directory.

Du coup, il ne faut pas espérer pouvoir utiliser des statiques (par exemple pour un singleton) dans l'objectif de partager des informations d'une webapplication à l'autre, même dans le cas où il s'agit strictement de la même classe, chaque webapplication posséde sa propre sandbox et donc sa propre statique.

à titre d'exemple, le lien http://tomcat.apache.org/tomcat-4.1-doc/class-loader-howto.html explique la hiérarchie de classloaders utilisée dans Tomcat 4.1 et que pour les applications web :

A class loader is created for each web application that is deployed in a single Tomcat 4 instance.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.