it-swarm.com.de

Lädt Tomcat dieselbe Bibliotheksdatei zweimal in den Speicher, wenn sich diese in zwei Web-Apps befindet?

Ich habe zwei Anwendungen im Ordner Tomcat/webapps

Tomcat/webapps/App1
Tomcat/webapps/App2

Beide Anwendungen nutzen die gleichen Bibliotheken. Welche sind zum Beispiel in Tomcat/webapps/App1/WEB-INF/lib gespeichert.

Sind beide Bibliotheken zweimal im Speicher geladen?

Soll ich diese gemeinsam genutzten Bibliotheken in Tomcat/server/lib einfügen?

48
Sergio del Amo

Wie Sie sehen, hier , erstellt Tomcat einen Klassenlader pro Webapp auf Ihrem Server .. Wenn Sie also Webapp1 und Webapp2 haben, die dieselbe Bibliothek verwenden, wird diese Bibliothek tatsächlich zweimal geladen.

Sie können diese Bibliothek schließlich im allgemeinen Verzeichnis (Tomcat-Verzeichnis/common/lib) ablegen, wenn sie von all - Webapps gemeinsam genutzt wird, die auf Ihrem Tomcat-Server ausgeführt werden.

37
Romain Linsolas

Ich würde nicht empfehlen, die JAR-Dateien im freigegebenen Ordner abzulegen. Nehmen wir zum Beispiel an, dass Sie in Zukunft eine Drittanbieteranwendung bereitstellen müssen, die eine neuere Version einer JAR-Datei im Ordner WEB-INF enthält. Für diese Anwendung werden die Klassen der JAR-Datei zweimal geladen (auch wenn sie denselben Namen haben), eine aus dem freigegebenen Ordner und eine aus dem Web-App-Ordner. Diese Situation kann dazu führen, dass Fehler sehr schwer zu finden sind.

Wenn sich die JAR-Dateien in den Web-App-Ordnern befinden, werden sie von separaten Klassenladern geladen und stören sich nicht.

29
kgiannakakis

Aus Erfahrung: Die beiden Web-Apps sind vollständig voneinander isoliert - die Bibliotheken für eine werden nicht in einer anderen verwendet - um Ihre erste Frage zu beantworten - ja, sie würden zweimal geladen werden.

Um Ihre zweite Frage zu beantworten, ob Sie diese Bibliotheken im gemeinsam genutzten Verzeichnis von Tomcat bereitstellen sollten - ich würde nein sagen, und hier ist der Grund:

Wenn Sie eine Bibliotheks-Jar am freigegebenen Speicherort (Tomcat/server/lib) bereitstellen, wird diese Version der Bibliothek zum Standard für alle Webanwendungen, die unter dieser Instanz von Tomcat ausgeführt werden. Wie Sie aus dieser Übersicht der Tomcat-Architektur sehen können, arbeitet der Class-Loader "down the chain", wobei der lib-Ordner einer einzelnen Web-App der letzte Ort ist, an dem er suchen wird, bevor er eine Klasse-nicht-wirft. Ausnahme gefunden. Dies trifft nicht auf Tomcat 6 und Tomcat 7 zu: Alle Klassen in den Web-Apps lib und Klassenordner wird werden vor den gemeinsamen aufgelöst, und daher werden andere Apps, die all ihre Jars verwenden, nicht beschädigt im Krieg 2 .

Das Problem der Bereitstellung einer gemeinsam genutzten Bibliothek in diesem Verzeichnis besteht daher darin, dass die Architektur für einzelne Anwendungen, die voneinander isoliert sind, unterbrochen wird. Wenn Sie eine Anwendung eines Drittanbieters bereitstellen möchten (z. B. wenn Sie eine App ausführen, die Portlets für die Verarbeitung bestimmter Inhalte verwendet), werden Sie sofort von Problemen mit der Versionsabhängigkeit in Kenntnis gesetzt - Ihre freigegebene Version einer Bibliothek kann davon abweichen Wenn Sie das Paket bereits geladen haben, werfen Sie Ausnahmen nach rechts und in die Mitte.

7
Ian

Wir verwenden Tomcat6 und finden einen guten Weg, um Tomcat mit gängigen Bibliotheken zu füllen, die alle unsere Webapps benötigen.

Bearbeiten Sie in conf/catalina.properties den Eintrag common.loader . Z.B. Hängen Sie einen zusätzlichen Ordner mit Gläsern an, die Sie gerne mit "Mylibs" teilen möchten.

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

Dann legen Sie alle gängigen Bibliotheken dort ab. Erledigt.

Warum haben wir begonnen, in allen Webapps (WAR-Dateien) einen Ordnermylibs anstelle von WEB-INF/lib zu verwenden? 

Der Einsatz wurde zu einem Alptraum, nachdem der Krieg die 50-MB-Grenze überschritten hatte!

Wenn Sie eine Web-App mit einer Never-Jar-Version haben, können Sie sie trotzdem in WEB-INF/lib ablegen, um das zu überschreiben, was Sie in mylibs haben.

6
Toni Bünter

Wenn Sie nicht möchten, dass Ihre Bibliotheken zweimal geladen werden, fügen Sie sie ein: 

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

(aus der Frage entfernt und hier kopiert, damit abgestimmt/kommentiert werden kann)

2
Kevin Panko

PermGen Space of Heap wird zum Speichern von Klassen und Metadaten zu Klassen in Java verwendet.

Fehler Java.lang.OutOfMemoryError: PermGen-Speicherplatz kann häufig auftreten, da viele doppelte Bibliotheken in Apache Tomcat geladen werden. __

0
mayank agrawal