Tomcat carica due volte lo stesso file di libreria in memoria se si trovano in due app Web?

StackOverflow https://stackoverflow.com/questions/267953

  •  06-07-2019
  •  | 
  •  

Domanda

Ho due applicazioni nella cartella tomcat / webapps .

tomcat/webapps/App1
tomcat/webapps/App2

Entrambe le applicazioni condividono le stesse librerie. Che sono memorizzati ad esempio in tomcat / webapps / App1 / WEB-INF / lib .

Entrambe le librerie sono state caricate due volte in memoria?

Devo mettere queste librerie condivise in tomcat / server / lib ?

È stato utile?

Soluzione

Come puoi vedere qui , Tomcat crea un caricatore di classi per webapp sul tuo server. Pertanto, se hai webapp1 e webapp2 che condividono la stessa libreria, questa libreria verrà effettivamente caricata due volte.

Puoi eventualmente posizionare questa libreria nella directory comune (tomcat-dir / common / lib) se è condivisa da tutte le webapp che girano sul tuo server Tomcat.

Altri suggerimenti

Non consiglierei di mettere i file jar nella cartella condivisa. Supponiamo, ad esempio, che in futuro sia necessario distribuire un'applicazione di terzi, che ha una versione più recente di un file jar nella cartella WEB-INF. Per questa applicazione le classi del vaso verranno caricate due volte (anche se hanno gli stessi nomi), una dalla cartella condivisa e una dalla cartella dell'app Web. Questa situazione può causare errori molto difficili da trovare.

Se i file jar si trovano nelle cartelle delle app Web, vengono caricati da caricatori di classi separati e non interferiscono tra loro.

Per esperienza: le due app Web sono completamente isolate l'una dall'altra - le librerie per una non sono utilizzate in un'altra - quindi per rispondere alla tua domanda iniziale - sì, verrebbero caricate due volte.

Per rispondere alla seconda domanda, se è necessario distribuire queste librerie nella directory condivisa di Tomcat, direi di no, ed ecco perché:

Se si distribuisce una libreria Jar nella posizione condivisa (tomcat / server / lib), quella versione della libreria diventa l'impostazione predefinita per tutte le applicazioni Web in esecuzione in quell'istanza di Tomcat. Come puoi vedere da questa panoramica dell'architettura tomcat , la classe- loader funziona "lungo la catena", con la cartella lib di una singola app web che è l'ultima posizione in cui verrà visualizzata prima che generi un'eccezione non trovata per la classe. Questo non è vero in Tomcat 6 e Tomcat 7: qualsiasi classe nella cartella lib delle app Web e classi verrà risolta prima di quelle comuni, e quindi, ciò non interromperà altre app che distribuiscono tutte le loro barattoli in guerra 2 .

Il problema quindi di distribuire una libreria condivisa in quella directory è che rompe l'architettura per le singole applicazioni che sono isolate l'una dall'altra. Bene nell'esempio iniziale, ma se si desidera distribuire un'applicazione di terze parti (ad esempio se si esegue un'app che utilizza Portlet per gestire contenuti specifici), si verificano immediatamente problemi di dipendenza dalla versione: la versione condivisa di una libreria potrebbe non è corretto per l'applicazione di terze parti, ma poiché il pacchetto è già caricato, genererai eccezioni a destra e al centro.

Stiamo usando tomcat6 e troviamo un buon modo per far riempire tomcat con le librerie comuni di cui hanno bisogno tutte le nostre webapp.

Modifica in conf / catalina.properties la voce common.loader . Per esempio. aggiungi una cartella aggiuntiva con i barattoli che ti piace condividere "mylibs"

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

Quindi inserisci tutte le librerie comuni lì. Fatto.

Perché abbiamo iniziato a usare una cartella mylibs invece di WEB-INF / lib in tutte le webapp (file WAR)?

La distribuzione iniziò ad essere un incubo dopo che la GUERRA attraversò la linea dei 50 MB!

Quando hai una webapp con una versione never jar puoi comunque metterla in WEB-INF / lib per sovrascrivere ciò che hai in mylibs .

Se non vuoi che le tue librerie vengano caricate due volte, inseriscile in:

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

(rimosso dalla domanda e copiato qui in modo che possa essere votato / commentato)

PermGen Space of heap viene utilizzato per memorizzare classi e metadati relativi alle classi in Java.

Errore java.lang.OutOfMemoryError: lo spazio PermGen può verificarsi frequentemente perché stiamo caricando molte librerie duplicate in apache tomcat qualcuno può condividerlo a riguardo in dettaglio

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top