2011-06-13 16 views
16

Desidero poter distribuire le modifiche al codice in Tomcat (vicino all'istante), mentre sto sviluppando in Eclipse.Tomcat ed Eclipse Zero Turnaround Deployment

Finora, ho il mio output da Eclipse posizionando le classi costruite nella cartella WEB-INF/classes della mia applicazione web.

Ho anche un contesto ricaricabile, con web.xml come risorsa guardata. Qualsiasi modifica/salvataggio in questo file fa ricarica la mia app Web, impiegando poco più di un secondo, molto più rapidamente della creazione di un nuovo file di guerra e della sua distribuzione completa.

Tuttavia, ciò che mi piacerebbe fare è attivare la ridistribuzione quando modifico qualsiasi file sorgente. Poiché i file .class sono stati modificati in Tomcat, sembra che sia necessario monitorare tutte le modifiche nella cartella WEB-INF/classes e sono bambini.

Ho letto che posso aggiungere ulteriori risorse guardate in context.xml di Tomcat ma questo non sembra essere proprio quello di cui ho bisogno - a meno che non sia possibile specificare una directory che verrà guardata (incluso il monitoraggio in modo ricorsivo di sottocartelle e file)?

<Context> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <WatchedResource>WEB-INF/someother.file</WatchedResource> 
    <Manager pathname=""/> 
</Context> 

Quindi, in sostanza, la mia domanda è posso guardare l'intera cartella classi (senza includere ogni WatchedResource esplicitamente) per innescare un redeploy in Tomcat?

In caso contrario, è possibile configurare Eclipse su touch il file web.xml, ogni volta che si salva un file sorgente in quel progetto? Sto sviluppando su un sistema Windows. :(


PS Io non sono interessati al prodotto JRebel. Qualsiasi risposta dovrebbe essere una soluzione gratuito.


Aggiornamento

Secondo il Tomcat documentation, la cartella delle classi deve essere monitorata impostando il contesto da ricaricare:

Impostare su true se si desidera Catalina a classi del monitor in/WEB-INF/classes/ e/WEB-INF/lib per le modifiche, e ricaricare automaticamente l'applicazione web se viene rilevata una modifica.

Solo le modifiche al web.xml sembrano attivare una ricarica. È un bug o la mia configurazione è errata?

Inoltre, ho letto su come impostare l'attributo docBase per un determinato contesto:

docBase="webapps/someExample" 

Questo sembra essere vicino a quello che mi serve, come ho potuto quindi ripubblicare in Eclipse rapidamente. Il mio unico problema è che ho bisogno di più web app/servlet da eseguire contemporaneamente in Tomcat, sulla stessa porta ecc.

risposta

5

Per questi casi, ho impostato l'output di eclipse in WEB-INF/classes come è stato fatto e creato un file di contesto con docBase impostato nella cartella webapp (padre di WEB-INF) nel progetto. Questo viene inserito manualmente in conf/Catalina/localhost (assumendo configurazioni predefinite per alcuni elementi di server.xml). Il risultato finale è tomcat che termina servendo dalla directory di sviluppo. Quindi, modifica un servlet o un'altra classe e viene aggiornato nella cartella delle classi. Salva un jsp ed è immediatamente disponibile.

Se progetto strutturato come:

src 
|-main 
    |-webapp 
    |-images 
    |-js 
    |-WEB-INF 
     |-jsp 
     |-classes 

Allora contesto sarebbe come:

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="/path" reloadable="true" 
    docBase="<pathtoproject>/src/main/webapp" /> 
+0

Sai se esiste un modo per farlo con più app Web in esecuzione in Tomcat? (Uno solo deve essere nel percorso di 'build output') – Mikaveli

+0

Non sono sicuro di seguirti. Disponi di più progetti web indipendenti che vuoi comportarti allo stesso modo durante lo sviluppo? Oppure, hai più progetti web che utilizzano la stessa libreria condivisa e vuoi che la libreria condivisa si compili in una cartella di classi di progetti web? Se i progetti sono indipendenti, è sufficiente un file di contesto per progetto (denominare il file .xml). Se i progetti utilizzano lo stesso codice condiviso e lo si desidera compilare nella cartella delle classi Web, non sono sicuro di come si farebbe. – philwb

+0

Possiedo più applicazioni Web che devono essere eseguite nella stessa istanza di Tomcat. Non ho bisogno dello stesso comportamento "hot deploy". – Mikaveli

2

Forse il progetto Web Tools di Eclipse con auto-ridistribuzione abilitato ti aiuterà? Aggiungi un server, apri le proprietà e in Pubblicazione vedrai un pulsante radio che dice "Pubblica automaticamente quando le risorse cambiano".Ciò comporterà una ridistribuzione se le modifiche alle classi sovrascrive semplicemente le risorse. È possibile installare WTP tramite un sito di aggiornamento integrato (solo Eclipse), quindi controllare gli aggiornamenti del software. È gratuito per la maggior parte dei server ma non supporta alcune funzionalità di Websphere?

+0

Sto già utilizzando WTP. Una ripubblicazione completa del mio progetto richiederebbe alcuni minuti, è quello che sto cercando di evitare. – Mikaveli

+0

E 'perché la riassegnazione richiede così tanto tempo? Intendo il riavvio del contesto servlet e il riscaldamento delle cache (primavera ecc.) Richiede tempo. O cosa ci vuole così tanto tempo? – toomasr

+0

Poiché ci sono così tante classi e file, la build in Eclipse impiega anni per essere pulita e ripubblicata. Se modifico le classi mentre procedo, allora ricarico il contesto, questo è _molto_ più veloce. Inoltre, per favore vedi il mio aggiornamento. Grazie. – Mikaveli

0

Prova l'agente JVM caricato a molla che ho descritto nel seguente risposta: https://stackoverflow.com/a/37064672/1034436

Mentre questo ha funzionato per la mia applicazione web Spring, questo dovrebbe funzionare con vanilla Eclipse + WTP + Tomcat + Dynamic Web Applicatio ns dal momento che Spring Loaded funziona sul livello JVM/Classloading.

Sarà comunque necessario utilizzare "Pubblica automaticamente quando le risorse cambiano", come indicato da @toomasr nella sua risposta. Tuttavia,, è necessario disabilitare anche l'opzione "Ricarica automatica modulo per impostazione predefinita". Se hai già aggiunto/pubblicato moduli da Eclipse a Tomcat, disattiva "Ricarica automatica" per ciascun modulo Web (tramite la scheda Moduli della pagina di configurazione Tomcat). Ciò dovrebbe impedire a Tomcat di ricaricare l'applicazione quando viene aggiornato un singolo file di classe, il che, a mio avviso, è ciò che è tutto il tempo di ricarica/attesa.