2015-10-08 22 views
7

Sono completamente confuso su come il caricamento della classe avviene in tomcat. Quindi, per favore, sopportami se la mia domanda sembra stupida.Spring jar nella cartella lib tomcat

Distribuiamo più applicazioni web a molla su server singolo tomcat. Per ridurre l'ingombro della memoria, abbiamo pensato di disporre di file jar di primavera, di ibernazione e di database nella cartella di tomcat lib, in modo che fossero condivisi da tutte le applicazioni web.

Ho iniziato prima contrassegnando le dipendenze di molla come provided e copiato quei vasi su tomcat lib. Ma all'avvio del server ho iniziato a ricevere più ClassNotFoundErrors, come per commons-logging, commons-fileupload, jackson, quindi ho dovuto spostare anche questi vasi per eseguire il backup di lib.

Ma poi questo ha iniziato a sentirsi pescoso. Che cosa succede se in futuro aggiungo un'altra dipendenza primaverile al mio progetto, ad esempio spring-data-cassandra. Avrei bisogno di spostare anche i suoi barattoli dipendenti? Questo potrebbe essere senza fine. Potrei anche ottenere errori CNF in fase di esecuzione.

Ho provato a seguire il collegamento this e ho riportato il contesto di primavera e il web di primavera alla guerra delle applicazioni. Ma non ha funzionato, ha ottenuto ClassNotFound su alcune classi durante l'inizializzazione WebApplicationIntializer. Ho cercato di capire l'ordine di classes getting loaded in tomcat, ma non ho capito molto.

Quindi ho trovato una spiegazione completa diversa per JDBC driver loading che in qualche modo contraddice tutte le altre spiegazioni e mi ha lasciato completamente confuso.



Mentre leggevo di più, penso che non è un approccio giusto per spostare vasetti di primavera a lib Tomcat, ma ancora non hanno avuto un buon ragionamento. E allora perché funziona il driver JDBC? Qualcuno può spiegare per favore? Inoltre il classloader per ogni webapp crea una copia di ogni classe?

Modifica 1: sono venuto a sapere che alcune dipendenze sono optional in vasetti di primavera e saranno necessarie se sono in uso nella mia webapp. Quindi spring-web dipende dalle librerie jackson ma è opzionale per la mia app. Quindi ho bisogno di scoprire quali sono necessari tutti i barattoli per il mio progetto e sono richiesti anche per la primavera, quei vasi devono essere spostati su tom.

risposta

1

Proverò a spiegare quello che so.

Quando si distribuisce una guerra contro il vostro gatto, la classe di carico avverrà in questo modo:

  1. sguardo per la classe per caricare nel vostro GUERRA classloader
  2. se non trovato mossa per genitore (tomcat/lib cartella)

Quello che succede nel vostro caso è che anche la primavera ha molte dipendenze, se la impacchettate nella vostra guerra, le sue dipendenze sarebbero state impacchettate pure e tutto avrebbe funzionato bene. Ma dal momento che hai definito Spring come fornito, tutte le sue dipendenze sono considerate pure fornite, e quando lo metti nella cartella/lib, spring è accessibile, ma le sue dipendenze no.

Quello che devi fare è mettere tutte le dipendenze primaverili e le dipendenze delle dipendenze (ecc.) Anche nella cartella lib. Un'altra soluzione consiste nel definire un WAR intermedio nella gerarchia di caricamento delle classi che conterrà tutte le tue librerie comuni.

+0

grazie per l'input. Sembra che le dipendenze che stavano creando un problema fossero 'facoltative'.Quindi è davvero difficile scoprire le dipendenze transitive di cui avrei bisogno – sidgate

+0

Se usi Maven per costruire i tuoi WAR, esso raggruppa tutti i deft transitivi in ​​artefatto WAR. –

+0

non tutto, le dipendenze opzionali non sono incluse – sidgate