Comment le fait de la classe un travail de chargement lors de la même classe existe dans plusieurs applications sur le même serveur?
J'ai plusieurs web-applications en cours d'exécution sur un serveur d'application et chaque web-app de la GUERRE de fichier contient une copie du même fichier jar.
Est-ce à dire qu'une classe dans ce fichier jar sera chargé à plusieurs reprises dans la JVM, une fois pour chaque fichier WAR il existe dans? Après, si j'ai une méthode synchronisée statique dans une telle classe, il n'est synchronisé entre les threads au sein de l'application web, il existe, mais pas synchronisées avec la même méthode dans la même classe dans un autre fichier jar dans un autre fichier WAR? (Espérons que la question du sens, permettra de clarifier si nécessaire).
Si c'est le cas je suppose que la meilleure solution est de supprimer le fichier jar à partir de chaque fichier WAR et de le déployer à une salle de classpath dossier sur le serveur?
Vous devez vous connecter pour publier un commentaire.
Un chargeur de classe Java fonctionne généralement par la recherche de classes dans un ou plusieurs endroits dans une séquence fixe. Par exemple, le chargeur de classe de chargement de votre application lorsque vous l'exécutez à partir de la ligne de commande regarde en premier dans la
rt.jar
fichier (et d'autres sur la bootclasspath), puis dans les répertoires et les fichiers JAR spécifié par votre classpath.Une webapp classloading le principe est similaire, mais un peu plus compliqué dans la pratique. Pour une webapp, une webapp du chargeur de classe regarde pour les classes dans l'ordre suivant. Par exemple Tomcat 6 looks pour les classes dans cet ordre:
Bien sûr, une fois que le chargeur de classe a trouvé la classe qu'il cherche, il cherche pas plus loin. Donc les classes avec le même nom plus tard dans l'ordre ne sera pas chargée.
La complication est que le conteneur web a un chargeur de classe pour chaque webapp, et ces chargeurs de classes déléguer à d'autres chargeurs de classes qui gèrent les classes communes. Dans la pratique, cela signifie que certaines classes ne pourront jamais être chargée qu'une seule fois pour l'ensemble du conteneur (par exemple, 1. et 2.) et d'autres peuvent se charger plusieurs fois par différents chargeurs de classes.
(Lorsqu'une classe est chargé plus d'une fois, il en résulte distinctes
Class
objets et distinctes de la classe statique. Les versions de la classe sont de types différents, aussi loin que la JVM est concerné et vous ne pouvez pas transtypage d'une version à l'autre).Enfin, Tomcat peut être configurer pour permettre à chaque webapps d'être "chaud chargé". Cela implique l'arrêt d'une application web, la création d'un nouveau chargeur de classe, et en le redémarrant.
SUIVI
Il dépend sur les détails, mais il ne sera probablement pas. (Ou de regarder si d'une autre manière, si une classe a fait été chargé à plusieurs reprises, un
static
méthode de "charge" de la classe auront accès à un ensemble différent destatic
champs.)Si vous voulez vraiment un singleton demande de l'instance de classe partagé par plusieurs webapps dans le même conteneur, il est plus simple si vous mettez la classe en
$CATALINA_HOME/lib
ou l'équivalent. Mais il vous faut aussi vous demander si c'est une bonne conception du système. Envisager de combiner les webapps, ou à l'aide de la demande de transfert etc au lieu d'une structure de données partagées. Le pattern singleton a tendance à être gênant dans webapps, et cette saveur est encore plus.A
à partir de l'e. g. un POTa.jar
dansWEB-INF/lib
qui est distribué dans le exact même fichier dans les différentes Guerres sur le même serveur (ou l'OREILLE). Lorsque je veux créer un cache couvrant toutes les Guerres sur le serveur (ou l'OREILLE) d'instances de la classeA
cela ne fonctionnera pas (sauf que j'ai déplacer le BOCALa.jar
à~/lib/ext
ou presque). VaserialVersionUID
sauver mon cache à ce point?serialVersionUID
pourrait le faire. (Mais je pense que la réponse courte est Non.)Serveurs d'applications Java EE utilisent généralement plusieurs chargeurs de classes pour isoler les applications les unes des autres, et de permettre de nouvelles versions d'une application à être déployé sans affecter les autres applications.
Vous obtenez les motifs tels que plusieurs fichiers WAR et un EJB fichier dans l'OREILLE avec une hiérarchie de chargeurs de classes, chaque GUERRE a ses propres.
Ce n'conduire à la duplication comme vous le décrivez, mais ce n'est pas necesserily une mauvaise chose. Cela signifie que vous pouvez même avoir des versions différentes de la même Bocaux déployé un même temps, et qui peut en fait être benficial, permettant aux différentiels de la migration vers de nouvelles versions.
Certains serveurs d'application (WebSphere par exemple) ont un soutien explicite de la bibliothèque partagée du concept, et je ne les utiliser que.
Méfiez-vous de sauter juste Bocaux dans l'arbitraire chemins de classe, vous courez le risque de déstabilisation du serveur d'application lui-même.
La plupart des applications de serveur utiliser plus spécifique le long d'un chemin emporte politique.
Si vous avez plusieurs de la bibliothèque qui font la même chose, Vous devriez envisager de les mettre à l'intérieur de l'application serveur lib (f.e: TOMCAT_HOME/lib)