Integrazione di tomcat ed eclipse come ambiente di distribuzione a caldo


88

Vorrei configurare eclipse e tomcat in modo integrato in modo tale che le modifiche ai miei JSP e servlet (se possibile) si riflettano immediatamente senza richiedere una distribuzione.

Ok, questa è una di quelle domande che hanno molte risposte su Internet ma sembrano tutte diverse. (usa il plugin Sysdeo, usa il plugin JBOss, fai cose con un Eclipse obsoleto, usa invece MyEclipse ecc.) e non sono riuscito a trovare 1 risorsa definitiva a cui fare riferimento. Quindi, a mio vantaggio, qual è la procedura più semplice e consigliata per configurarlo?

Ciò presuppone che eclipse e tomcat funzionino indipendentemente. In realtà sono riuscito a integrarli in modo non a caldo usando le istruzioni qui: http://www.ibm.com/developerworks/opensource/library/os-eclipse-tomcat/index.html

Versione Eclipse Versione: 3.4.2 (Ganimede) Tomcat v6.0.20


17
4 anni dopo, sono sconcertato dal fatto che sia ancora un problema. Andiamo, è piuttosto fondamentale.
Konrad Garus

7 anni dopo (quasi), penso che ho scoperto una soluzione: stackoverflow.com/a/37064672/1034436
martian111

Risposte:


75

Ci sono due possibilità.

Innanzitutto, Eclipse ti consente di farlo, con un leggero cambiamento di configurazione (vedi anche questo post dettagliato )

  • aggiungi Tomcat all'elenco dei server
  • rendere il progetto "Progetto web dinamico" (sia tramite la procedura guidata di creazione che tramite la sezione facet nelle impostazioni)
  • aggiungi il progetto a Tomcat e configura il suo "Deployment assembly"
  • fare doppio clic su tomcat dall'elenco per aprire le configurazioni
  • Cambia "Pubblicazione" in "Non pubblicare mai automaticamente" (questo significa che il server non verrà riavviato quando premi ctrl + s)
  • avvia Tomcat in modalità debug

Ciò rifletterà ancora le modifiche al codice ma non riavvierà il server.

In secondo luogo, ho utilizzato il plugin FileSync per molto tempo:

  • configurare il plug-in per inviare tutte le classi dal bin director alla WEB-INF/classestua installazione di tomcat (questo è quasi lo stesso della configurazione dell'assembly di distribuzione)
  • configurare tutte le altre risorse per andare nelle rispettive posizioni
  • opzionalmente, esternalizza tutti i percorsi assoluti dalle impostazioni della posizione di sincronizzazione dei file a una singola variabile e configura quella variabile in eclipse (così sarai in grado di eseguire anche il commit delle impostazioni di sincronizzazione dei file, se tutti i membri stanno usando eclipse)
  • aggiungi Tomcat all'elenco dei server in eclipse, configura l'opzione "Posizioni dei server" su "Usa installazione tomcat" (la schermata si apre quando fai doppio clic su Tomcat dall'elenco dei server)
  • avvia Tomcat in modalità debug

In questo modo funziona perfettamente per me. Ogni cambiamento non strutturale si riflette immediatamente, senza ridistribuzione.

Aggiornamento:
è possibile leggere ulteriori informazioni sui metodi per la distribuzione a caldo qui .
Ho anche creato un progetto che sincronizza facilmente l'area di lavoro con il contenitore servlet.


@VladimirTsvetkov no - queste sono due opzioni separate
Bozho

Sto provando il tuo primo approccio ma sto usando Maven Overlays e quando cambio un file in uno degli overlay il server viene comunque riavviato (l'overlay non è un progetto web dinamico ma un modulo web dinamico). Qualche idea?
Hoffmann

2
Ho l'impressione che cambiando "Pubblicazione" in "Non pubblicare mai automaticamente" i JSP non vengano più ricaricati / ricompilati quando vengono modificati. La parte di ricarica della classe funziona bene anche se avviando Tomcat in modalità di debug.
yglodt

5
Lo faccio in un altro modo: primo, cambio per pubblicare automaticamente; secondo, fare clic sulla Modulesscheda nella configurazione del server, quindi fare clic su edit, deselezionare auto deploy enabled, penso che questo sia il modo più semplice. PS: il tuo primo modo non funziona per me.
autostrada

@hiway, dov'è questa scheda Moduli nella scheda di configurazione del server?
Mateus Viccari

30

Lascia semplicemente che eclipse scriva i file di classe direttamente nella directory $ TOMCAT / webapps / MyWebApp / WEB_INF / classes. Quindi, configura apache-tomcat per verificare se i file di classe sono stati aggiornati e, se lo sono, ricaricali.

Per configurare Tomcat per ricaricare automaticamente una classe quando cambia, è necessario

modifica $TOMCAT/conf/context.xmle imposta:

<Context reloadable="true"> 

Potrebbe anche essere necessario modificare e ricaricare il webapps/$YourWebApp/web.xmlfile e includere:

<web-app reloadable="true">

Non ricordo se sono necessarie entrambe le modifiche, ma è così che ho configurato il mio tomcat-6.0.18 per il ricaricamento automatico.


Secondo la documentazione, tomcat.apache.org/tomcat-6.0-doc/config/context.html raccomandano di non inserire Contextelementi nel file server.xml, ma dovrebbe monitorare / WEB-INF / classes / e / WEB-INF / lib per eventuali modifiche. Dove hai letto dell'attributo per l' web-appelemento?
Michael

Scusa, ho letto un po 'male la tua risposta. Il context.xml "dovrebbe essere caricato per ogni applicazione web".
Michael

2
Come si configura dove Eclipse scrive i file di classe?
yglodt

7

Disclaimer : sono solo un cliente felice, non lavoro per Zero Turnaround e non sono in alcun modo affiliato con loro.

Dai un'occhiata a JRebel : ti consente di programmare senza riavvio dell'applicazione web. Fondamentalmente funziona strumentando le tue classi e adattando i loro cambiamenti. Gestisce molti più casi rispetto alla distribuzione a caldo , inclusi:

  • Aggiunta / rimozione di metodi
  • Aggiunta / rimozione di costruttori
  • Modifica delle interfacce
  • Aggiunta / rimozione di interfacce implementate

È commerciale , ( dettagli sui prezzi , $ 550 / anno a giugno 2018) e ha molti plugin per framework di terze parti, tra cui:

  • Guice
  • Primavera
  • Puntoni 2

Ottieni una prova gratuita in modo abbastanza indolore - ti suggerisco di provarlo.


2
Jrebel, quando funziona, funziona. Quando non lo fa, è un incubo. Ho battuto la testa con il loro supporto per oltre una settimana e ancora non riesco a farlo funzionare nella mia semplice configurazione Spring Mvc. Non aiuteranno ulteriormente senza che io invii loro la mia app o un helloworld della mia app. E i tuoi prezzi non sono aggiornati: ora fanno pagare una bomba. Grazie a Dio ho usato solo la loro versione di prova
happybuddha

Il prezzo attuale è $ 365 / anno / posto
Joseph Lust

E ora
costa

3

Cambia il tuo spazio di lavoro in Eclipse in \ tomcat \ webapps Poiché è solo per il tuo lavoro, dovrebbe funzionare bene. Qualunque modifica apporti in Eclipse si trova nella stessa directory, tomcat cerca le applicazioni da distribuire


3

Nella vista server, crea un nuovo server, non aggiungere ancora alcuna risorsa (progetto) al server. Fare doppio clic sul server nella posizione dei server. Scegli "Usa installazione Tomcat". Modifica il "percorso di distribuzione" nella directory di distribuzione di Tomcat (Es: c: \ server \ Tomcat 7.0.14 \ webapps). Estendi la "Sezione di pubblicazione". Seleziona "Pubblica automaticamente dopo un evento di compilazione". Salva e chiudi. Dal menu Eclipse seleziona "Progetto -> Costruisci automaticamente". Dalla visualizzazione dei server, fai clic con il pulsante destro del mouse sul tuo server, "Aggiungi e rimuovi", pubblica il tuo progetto.


2

Perché non utilizzare un server Tomcat integrato da con in eclipse se questo è solo per lo sviluppo? Puoi configurare i server in Finestra-> Preferenze. Una volta configurato, se hai un jsp chiamato page.jsp puoi fare clic con il pulsante destro del mouse e selezionare Esegui sul server. In Preferenze-> Generale-> Browser Web puoi scegliere il meteo per utilizzare il browser integrato o uno esterno. Apporta alcune modifiche al tuo jsp, salva e aggiorna la tua pagina dal browser. Le modifiche verranno applicate automaticamente una volta salvato e aggiornato il browser.


2

Quello che funziona per me qui è:

context.xml in questo modo:

<Context path="/myapp" docBase="myapp" debug="5"
    reloadable="false" antiResourceLocking="false" antiJARLocking="true">
<!-- this because i´m using Spring 3.1 with Tomcat -->
    <Loader     loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" />

</Context>

Quindi, nella scheda Server in Eclipse, nella scheda "Moduli", ho disabilitato il "Ricaricamento automatico" per tutti i moduli distribuiti.

Consenti anche alla configurazione predefinita di consentire la pubblicazione automatica.

E sta usando Maven con WTP, non dimenticare di lasciare il contenuto di src / main / resources in, perché Eclipse insiste per escludere il contenuto di questa cartella della build finale.

Solo con tutto questo ho ottenuto classi complete (VM) con distribuzione a caldo di risorse !!!


1

Nel tuo ambiente di sviluppo, punta il tuo server Tomcat per cercare i JSP in qualunque directory li stai sviluppando. Non appena salvi il file, sarai in grado di vedere le modifiche.


1

Sono riuscito a farlo funzionare nel mio ambiente di sviluppo utilizzando l' agente JVM Spring Loaded . Mentre sviluppo applicazioni web Spring, la descrizione di quel progetto menziona che lo è

utilizzabile su qualsiasi bytecode che può essere eseguito su una JVM

Utilizzando la seguente configurazione, sono stato in grado di ottenere le modifiche da pubblicare automaticamente su un'istanza Tomcat collegata (il solito metodo Eclipse WTP). Sto usando Spring Tool Suite 3.7.3 basato su Eclipse Mars.2 (4.5.2).

  1. Scarica l'ultima versione JAR di Spring Loaded dal loro progetto Github . Questo è stato testato con springloaded-1.2.5.RELEASE.jar.
  2. Configura normalmente un server Tomcat in Eclipse (testato con Tomcat 8.0.30)
  3. Apri la pagina di configurazione del server Tomcat in Eclipse (fai doppio clic sull'istanza del server nella scheda "Server").
  4. Nella sezione "Opzioni server", deseleziona "Ricarica automatica moduli per impostazione predefinita".
    • Nota: se sono già stati aggiunti moduli web al server, potrebbe essere necessario disabilitare il "Ricaricamento automatico" su di essi singolarmente tramite la scheda "Moduli" (nella parte inferiore della finestra della pagina di configurazione).
  5. Nella sezione "Informazioni generali", fai clic su "Apri configurazione di avvio"
    • Nella scheda "Argomenti", aggiungi quanto segue alla fine degli "Argomenti VM": -javaagent:/path/to/downloaded/springloaded-1.2.5.RELEASE.jar -noverify
    • Per abilitare la visualizzazione dei JAR oltre ai .classfile del progetto , configurare l' -Dspringloaded=watchJars=argomento VM in base ai commenti di questo problema .

Avvia il server e pubblica i progetti di applicazioni Web dinamiche come al solito. Di nuovo, sono stato in grado di testarlo con le applicazioni web Spring. Ad esempio, la modifica del codice, l'aggiunta / sottrazione di metodi, ecc. Nelle classi @Controller sono state applicate quasi immediatamente dopo aver salvato il file e Eclipse ha compilato e pubblicato la classe modificata. Infine, la sezione FAQ del progetto Spring Loaded ha menzionato alcuni casi in cui le cose non si ricaricano, quindi richiederebbero un riavvio del server / dell'applicazione. Ma queste eccezioni sono molto meno frequenti.

Un'altra nota: NON funziona con il server Pivotal tc incorporato o il server VMware vFabric tc fornito con STS. Per quei server, esiste un'opzione "Abilita il ricaricamento basato su Java Agent (sperimentale)", ma che utilizza la versione precedente 1.2.0 di Spring Loaded, che non ha funzionato per me.


Sembra che tu debba accettare Spring, che ne dici Non Springdell'applicazione.
Tangoo

Sebbene sia necessario configurare il JAR SpringLoaded per Tomcat, le applicazioni in esecuzione NON devono essere applicazioni Spring (né includere alcun JAR Spring). L'ho testato con successo con un semplice, singolo HelloWorld Servlet.
martian111

0

Sei disponibile a utilizzare Jetty per scopi di sviluppo?

Se è così, è abbastanza semplice da usare con Maven: basta eseguire mvn jetty:run


0

Questo potrebbe non essere il modo migliore, ma per me funziona.

  • $ tomcat / conf / Catalina / localhost / .xml
  • $ contextPath / webapp / web / WEB-INF / lib / *. jar
  • $ contextPath / webapp / web /
  • $ eclispeWorkbench / project-servlet / src /
  • $ eclispeWorkbench / project-servlet / servlet.jardesc (dovrebbe esportare jar nella directory lib in $ contextPath)
  • $ eclipseWorkbench / project-jsp /

Uso un comando rsync per sincronizzare le modifiche dal mio progetto jsp a $ contextPath.

Usa il debug remoto in Eclipse per Tomcat che consentirà uno scambio a caldo limitato del codice. Se modifichi i campi statici o aggiungi metodi, dovrai esportare il jar e riavviare il contesto.


0

possiamo usare l'opzione qui sotto? Fare doppio clic su Server in eclipse -> Posizioni server -> Usa installazione tomcat. Prende il controllo dell'installazione di Tomcat. Non è necessario riavviare il server per le modifiche nelle classi Java.


0

Ho trovato un modo più semplice: uso di collegamenti simbolici: penso che questo sia il modo più veloce perché non c'è affatto sincronizzazione: la directory di tomcat e la directory del tuo progetto saranno sempre la stessa directory.

Tomcat rileverà periodicamente le modifiche e ridistribuirà l'applicazione.

C'è anche un modo per eseguire il debug della tua applicazione, quindi penso umilmente sia una buona soluzione.

Ho documentato la mia soluzione qui , per chiunque sia interessato.


posso sapere perché è necessario utilizzare un'applicazione Java remota poiché utilizza localhost, il che significa che sto eseguendo il debug utilizzando la mia macchina locale
Karen Goh

0

Nel caso tu abbia fretta:

  1. seleziona "non pubblicare mai automaticamente" in Tomcat (altro contenitore) in eclipse.
  2. avvia tomcat (altro contenitore) in modalità debug.

Ecco! :)


0

In Eclipse, fai clic su Progetto nel menu in alto e assicurati che "Costruisci automaticamente" sia selezionato. Questo ha risolto il mio problema. Stavo eseguendo Eclipse con Tomcat utilizzando i metadati del mio spazio di lavoro. Stavo anche eseguendo Maven in un progetto Dynamic Web Module. Per verificare, aggiungi la tua applicazione a Tomcat. Avvia Tomcat da Eclipse. Assicurati che la tua applicazione sia distribuita e in esecuzione. Apri la scheda Console in Eclipse. Apporta una modifica alla tua applicazione. Dopo un paio di secondi dovresti vedere la modifica che viene automaticamente creata e distribuita su Tomcat.


-2

Il più semplice, il più veloce: imposta Eclipse per generare un file WAR durante la compilazione; come passaggio successivo alla compilazione, copia il file WAR nella directory delle webapps di tomcat. Tomcat riconoscerà la modifica e aggiornerà il sito senza che sia necessaria la distribuzione. Nota che questo non è perfetto; gli utenti che utilizzano quella webapp potrebbero non avere un'esperienza ottimale, poiché Tomcat riavvia la webapp "sotto" loro; ma questo soddisfa la tua richiesta.


1
ok ... immagino di non aver chiarito le mie intenzioni. Non sono davvero interessato a distribuire l'app ad alcuni utenti, ma sto cercando di eseguire un tomcat con eclipse per le mie esigenze di sviluppo quotidiane e di abbreviare il ciclo di feedback di (make change) -> (See Result) invece di (Make Modifica) -> Distribuisci -> (Vedi risultato)
udit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.