Integration von Tomcat und Eclipse als Hot-Deployment-Umgebung

88

Ich möchte Eclipse und Tomcat auf integrierte Weise einrichten, sodass Änderungen an meinen JSPs und Servlets (falls möglich) sofort übernommen werden, ohne dass eine Bereitstellung erforderlich ist.

Ok, dies ist eine dieser Fragen, die im gesamten Internet viele Antworten hat, aber alle scheinen unterschiedlich zu sein. (Verwenden Sie das Sysdeo-Plugin, verwenden Sie das JBOss-Plugin, machen Sie Dinge mit einer veralteten Eclipse, verwenden Sie stattdessen MyEclipse usw.) und ich konnte keine definitive Ressource finden, auf die ich verweisen kann. Was ist zu meinem Vorteil das einfachste und am meisten empfohlene Verfahren, um dies einzurichten?

Dies setzt voraus, dass Eclipse und Tomcat unabhängig voneinander ausgeführt werden. Ich habe es tatsächlich geschafft, sie mithilfe der folgenden Anweisungen in einer nicht heißen Bereitstellungsmethode zu integrieren: http://www.ibm.com/developerworks/opensource/library/os-eclipse-tomcat/index.html

Eclipse-Version Version: 3.4.2 (Ganymede) Tomcat v6.0.20

udit
quelle
17
4 Jahre später bin ich verblüfft darüber, dass es immer noch ein Problem ist. Komm schon, es ist ziemlich grundlegend.
Konrad Garus
7 Jahre später (fast) denke ich, ich habe eine Lösung gefunden: stackoverflow.com/a/37064672/1034436
martian111

Antworten:

75

Es gibt zwei Möglichkeiten.

Erstens können Sie dies mit Eclipse mit einer geringfügigen Änderung der Konfiguration tun (siehe auch diesen ausführlichen Beitrag ).

  • Fügen Sie Tomcat zur Serverliste hinzu
  • Erstellen Sie das Projekt "Dynamisches Webprojekt" (entweder über den Erstellungsassistenten oder über den Abschnitt "Facetten" in den Einstellungen).
  • Fügen Sie das Projekt zu Tomcat hinzu und konfigurieren Sie die "Bereitstellungsassembly".
  • Doppelklicken Sie in der Liste auf Tomcat, um die Konfigurationen zu öffnen
  • Ändern Sie "Veröffentlichen" in "Nie automatisch veröffentlichen" (dies bedeutet, dass der Server nicht neu gestartet wird, wenn Sie Strg + s drücken).
  • Starten Sie Tomcat im Debug-Modus

Dies spiegelt weiterhin Codeänderungen wider, startet den Server jedoch nicht neu.

Zweitens habe ich das FileSync-Plugin schon lange verwendet:

  • Konfigurieren Sie das Plugin so, dass alle Klassen vom Bin Director an WEB-INF/classesIhre Tomcat-Installation gesendet werden (dies entspricht fast der Konfiguration der Bereitstellungsassembly).
  • Konfigurieren Sie alle anderen Ressourcen so, dass sie zu ihren jeweiligen Speicherorten gelangen
  • Externalisieren Sie optional alle absoluten Pfade von den Dateisynchronisierungsspeicherorteinstellungen zu einer einzelnen Variablen und konfigurieren Sie diese Variable in Eclipse (daher können Sie auch die Dateisynchronisierungseinstellungen festschreiben, wenn alle Mitglieder Eclipse verwenden).
  • Fügen Sie Tomcat in Eclipse zur Serverliste hinzu, konfigurieren Sie die Option "Serverstandorte" als "Tomcat-Installation verwenden" (der Bildschirm wird geöffnet, wenn Sie in der Serverliste auf Tomcat doppelklicken).
  • Starten Sie Tomcat im Debug-Modus

So funktioniert es perfekt für mich. Jede nicht strukturelle Änderung wird sofort ohne erneute Bereitstellung reflektiert.

Update:
Weitere Informationen zu den Methoden für die Hot-Bereitstellung finden Sie hier .
Ich habe auch ein Projekt erstellt , das den Arbeitsbereich einfach mit dem Servlet-Container synchronisiert.

Bozho
quelle
@VladimirTsvetkov nein - dies sind zwei getrennte Optionen
Bozho
Ich versuche Ihren ersten Ansatz, verwende jedoch Maven-Overlays. Wenn ich eine Datei in einem der Overlays ändere, wird der Server immer noch neu gestartet (das Overlay ist kein dynamisches Webprojekt, sondern ein dynamisches Webmodul). Irgendwelche Ideen?
Hoffmann
2
Ich habe den Eindruck, dass durch Ändern von "Veröffentlichen" in "Nie automatisch veröffentlichen" die JSPs beim Ändern nicht mehr neu geladen / kompiliert werden. Der Teil zum erneuten Laden von Klassen funktioniert jedoch einwandfrei, indem Tomcat im Debug-Modus gestartet wird.
Yglodt
5
Ich mache es auf eine andere Weise: Ändern Sie zuerst, um automatisch zu veröffentlichen; Zweitens : Klicken Sie Modulesin der Serverkonfiguration auf die Registerkarte und dann auf " editDeaktivieren" auto deploy enabled. Ich denke, dies ist der einfachste Weg. PS: Dein erster Weg funktioniert bei mir nicht.
Hiway
@hiway, wo befindet sich diese Registerkarte Module auf der Registerkarte Serverkonfiguration?
Mateus Viccari
30

Lassen Sie Eclipse die Klassendateien einfach direkt in das Verzeichnis $ TOMCAT / webapps / MyWebApp / WEB_INF / classes schreiben. Konfigurieren Sie dann apache-tomcat, um zu überprüfen, ob die Klassendateien aktualisiert wurden, und laden Sie sie gegebenenfalls neu.

Um Tomcat so zu konfigurieren, dass eine Klasse bei Änderungen automatisch neu geladen wird, müssen Sie

bearbeiten $TOMCAT/conf/context.xmlund einstellen:

<Context reloadable="true"> 

Möglicherweise müssen Sie Ihre webapps/$YourWebApp/web.xmlDatei auch bearbeiten und neu laden und Folgendes hinzufügen :

<web-app reloadable="true">

Ich kann mich nicht erinnern, ob beide Änderungen erforderlich sind, aber so habe ich meinen tomcat-6.0.18 so konfiguriert, dass er automatisch neu geladen wird.

Martin Tilsted
quelle
Laut der Dokumentation empfehlen sie , tomcat.apache.org/tomcat-6.0-doc/config/context.html nichtContext in die Datei server.xml einzufügen, sollten jedoch / WEB-INF / classes / und / WEB-INF überwachen / lib für Änderungen. Wo haben Sie über das Attribut für das web-appElement gelesen ?
Michael
Entschuldigung, lesen Sie Ihre Antwort ein wenig falsch. Die context.xml "sollte für jede Webanwendung geladen werden".
Michael
2
Wie konfigurieren Sie, wohin Eclipse die Klassendateien schreibt?
Yglodt
7

Haftungsausschluss : Ich bin nur ein zufriedener Kunde, arbeite nicht für Zero Turnaround und bin in keiner Weise mit ihnen verbunden.

Schauen Sie sich JRebel an - Sie können Code ohne Neustart der Webanwendung erstellen. Grundsätzlich funktioniert es, indem Sie Ihre Klassen instrumentieren und ihre Änderungen anpassen. Es behandelt viel mehr Fälle als Hot Deployment , einschließlich:

  • Methoden hinzufügen / entfernen
  • Konstruktoren hinzufügen / entfernen
  • Schnittstellen ändern
  • Implementierte Schnittstellen hinzufügen / entfernen

Es ist kommerziell ( Preisangaben : 550 USD / Jahr ab Juni 2018) und enthält zahlreiche Plugins für Frameworks von Drittanbietern, darunter:

  • Guice
  • Frühling
  • Streben 2

Sie erhalten eine kostenlose Testversion ganz schmerzlos - ich schlage vor, Sie probieren es aus.

Robert Munteanu
quelle
2
Jrebel, wenn es funktioniert, funktioniert es. Wenn nicht, ist es ein Albtraum. Ich habe mir über eine Woche lang mit ihrer Unterstützung den Kopf geschlagen und kann es immer noch nicht in meinem einfachen Spring-MVC-Setup zum Laufen bringen. Sie werden nicht weiter helfen, ohne dass ich ihnen meine App oder eine Welt meiner App sende. UND, Ihre Preise sind veraltet - sie verlangen jetzt eine Bombe. Gott sei Dank habe ich nur ihre Testversion verwendet
happybuddha
Aktueller Preis ist $ 365 / Jahr / Sitz
Joseph Lust
Und jetzt ist es $ 550 / Jahr / Sitz
Frewper
3

Ändern Sie Ihren Arbeitsbereich in Eclipse in \ tomcat \ webapps. Da dies nur für Ihre Arbeit vorgesehen ist, sollte dies problemlos funktionieren. Alle Änderungen, die Sie in Eclipse vornehmen, befinden sich im selben Verzeichnis. Tomcat sucht nach Anwendungen, die bereitgestellt werden sollen

PaganSensei
quelle
3

Erstellen Sie in der Serveransicht einen neuen Server und fügen Sie dem Server noch keine Ressource (Projekt) hinzu. Doppelklicken Sie auf den Server am Serverstandort. Wählen Sie "Tomcat-Installation verwenden". Ändern Sie "Bereitstellungspfad" in das Tomcat-Bereitstellungsverzeichnis (Beispiel: c: \ server \ Tomcat 7.0.14 \ webapps). Erweitern Sie "Veröffentlichungsbereich". Aktivieren Sie "Nach einem Build-Ereignis automatisch veröffentlichen". Speichern und schließen. Aktivieren Sie im Eclipse-Menü "Projekt -> Automatisch erstellen". Klicken Sie in der Serveransicht mit der rechten Maustaste auf Ihren Server, "Hinzufügen und Entfernen", und veröffentlichen Sie Ihr Projekt.

ticu0000
quelle
2

Warum nicht einen integrierten Tomcat-Server von mit in Eclipse verwenden, wenn dies nur für die Entwicklung ist? Sie können Server unter Fenster-> Einstellungen konfigurieren. Sobald es konfiguriert ist, wenn Sie einen JSP namens page.jsp haben, können Sie mit der rechten Maustaste darauf klicken und Auf Server ausführen auswählen. Unter Einstellungen-> Allgemein-> Webbrowser können Sie das Wetter auswählen, um den eingebauten oder einen externen Browser zu verwenden. Nehmen Sie einige Änderungen an Ihrem JSP vor, speichern und aktualisieren Sie Ihre Seite über den Browser. Die Änderungen werden automatisch übernommen, sobald Sie Ihren Browser speichern und aktualisieren.

Jared
quelle
2

Was hier für mich funktioniert ist:

context.xml wie folgt:

<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>

Dann habe ich auf der Registerkarte "Server" in Eclipse auf der Registerkarte "Module" das "automatische Neuladen" für alle bereitgestellten Module deaktiviert.

Lassen Sie auch die Standardkonfiguration, um die automatische Veröffentlichung zu ermöglichen.

Wenn Sie Maven mit WTP verwenden, vergessen Sie nicht, den Inhalt von src / main / resources zu belassen, da Eclipse darauf besteht, den Inhalt dieses Ordners des endgültigen Builds auszuschließen.

Nur mit all dem habe ich volle (VM) Klassen Hot-Deploy mit Ressourcen Hot-Deploy bekommen !!!

chuckedw
quelle
1

Zeigen Sie in Ihrer Entwicklungsumgebung einfach auf Ihren Tomcat-Server, um in dem Verzeichnis, in dem Sie sie entwickeln, nach JSPs zu suchen. Sobald Sie die Datei speichern, können Sie die Änderungen sehen.

Cameron
quelle
1

Ich habe es geschafft, dies mit dem Spring Loaded JVM-Agenten in meiner Entwicklungsumgebung zum Laufen zu bringen. Während ich Spring-Webanwendungen entwickle, wird in der Beschreibung dieses Projekts erwähnt, dass dies der Fall ist

Verwendbar für jeden Bytecode, der auf einer JVM ausgeführt werden kann

Mit dem folgenden Setup konnte ich Änderungen erhalten, die automatisch in einer angehängten Tomcat-Instanz veröffentlicht werden (die übliche Eclipse-WTP-Methode). Ich verwende Spring Tool Suite 3.7.3 basierend auf Eclipse Mars.2 (4.5.2).

  1. Laden Sie die neueste Version von JAR of Spring Loaded von ihrem Github-Projekt herunter . Dies wurde mit springloaded-1.2.5.RELEASE.jar getestet.
  2. Richten Sie einen Tomcat-Server wie gewohnt in Eclipse ein (getestet mit Tomcat 8.0.30).
  3. Öffnen Sie die Konfigurationsseite des Tomcat-Servers in Eclipse (doppelklicken Sie auf der Registerkarte "Server" auf die Serverinstanz).
  4. Deaktivieren Sie im Abschnitt "Serveroptionen" das Kontrollkästchen "Module werden standardmäßig automatisch neu geladen".
    • Hinweis: Wenn dem Server bereits Webmodule hinzugefügt wurden, müssen Sie möglicherweise "Auto Reload" einzeln über die Registerkarte "Module" (unten im Fenster der Konfigurationsseite) deaktivieren.
  5. Klicken Sie im Abschnitt "Allgemeine Informationen" auf "Startkonfiguration öffnen".
    • Fügen Sie auf der Registerkarte "Argumente" am Ende der "VM-Argumente" Folgendes hinzu: -javaagent:/path/to/downloaded/springloaded-1.2.5.RELEASE.jar -noverify
    • .classKonfigurieren Sie das -Dspringloaded=watchJars=VM-Argument gemäß den Kommentaren dieses Problems, damit JARs zusätzlich zu den Projektdateien überwacht werden können .

Starten Sie den Server und veröffentlichen Sie Dynamic Web Application-Projekte wie gewohnt darauf. Auch dies konnte ich mit Spring-Webanwendungen testen. Zum Beispiel wurden das Ändern von Code, das Hinzufügen / Subtrahieren von Methoden usw. in @ Controller-Klassen fast sofort angewendet, nachdem ich die Datei gespeichert und Eclipse erstellt und die geänderte Klasse veröffentlicht habe. Schließlich wurden im FAQ-Bereich des Spring Loaded-Projekts einige Fälle erwähnt, in denen die Dinge nicht neu geladen werden, sodass ein Neustart des Servers / der Anwendung erforderlich wäre. Diese Ausnahmen sind jedoch viel seltener.

Noch ein Hinweis: Dies funktioniert NICHT mit dem eingebetteten Pivotal tc Server oder VMware vFabric tc Server, der mit STS geliefert wird. Für diese Server gibt es die Option "Java Agent-basiertes Neuladen aktivieren (experimentell)", die jedoch die ältere Version 1.2.0 von Spring Loaded verwendet, die für mich nicht funktioniert hat.

martian111
quelle
Es scheint, dass Sie aufnehmen müssen Spring, wie wäre es mit einer Non SpringBewerbung.
Tangoo
Obwohl die SpringLoaded-JAR für Tomcat konfiguriert sein muss, müssen die ausgeführten Anwendungen selbst KEINE Spring-Anwendungen sein (und auch keine Spring-JARs enthalten). Ich habe dies erfolgreich mit einem einfachen, einzelnen HelloWorld-Servlet getestet.
Martian111
0

Sind Sie offen für die Verwendung von Jetty für Entwicklungszwecke?

Wenn ja, ist es ziemlich einfach mit Maven zu verwenden - einfach ausführen mvn jetty:run

matt b
quelle
0

Dies ist vielleicht nicht der beste Weg, aber es funktioniert für mich.

  • $ tomcat / conf / Catalina / localhost / .xml
  • $ contextPath / webapp / web / WEB-INF / lib / *. jar
  • $ contextPath / webapp / web /
  • $ eclispeWorkbench / project-servlet / src /
  • $ eclispeWorkbench / project-servlet / servlet.jardesc (sollte jar in $ contextPath nach lib dir exportieren)
  • $ eclipseWorkbench / project-jsp /

Ich verwende einen rsync-Befehl, um Änderungen von meinem JSP-Projekt mit $ contextPath zu synchronisieren.

Verwenden Sie das Remote-Debugging in Eclipse für Tomcat, um ein begrenztes Hot-Swapping von Code zu ermöglichen. Wenn Sie statische Felder ändern oder Methoden hinzufügen, müssen Sie das JAR exportieren und den Kontext neu starten.

TJR
quelle
0

Können wir die folgende Option verwenden? Doppelklicken Sie in Eclipse auf Server -> Serverstandorte -> Tomcat-Installation verwenden. Es übernimmt die Kontrolle über die Tomcat-Installation. Sie müssen den Server nicht neu starten, um Änderungen in Java-Klassen vorzunehmen.

Tushar Sagar
quelle
0

Ich habe einen einfachsten Weg gefunden: Verwendung symbolischer Links: Ich denke, dies ist der schnellste Weg, da überhaupt keine Synchronisation stattfindet: Das Tomcat-Verzeichnis und Ihr Projektverzeichnis sind immer dasselbe Verzeichnis.

Tomcat erkennt die Änderungen regelmäßig und stellt Ihre Anwendung erneut bereit.

Es gibt auch eine Möglichkeit, Ihre Anwendung zu debuggen, daher halte ich sie demütig für eine gute Lösung.

Ich habe meine Lösung hier für alle Interessierten dokumentiert .

Raul Luna
quelle
Kann ich wissen, warum es notwendig ist, eine Remote-Java-Anwendung zu verwenden, da sie localhost verwendet, was bedeutet, dass ich mit meinem eigenen lokalen Computer
debugge
0

Falls Sie es eilig haben:

  1. Aktivieren Sie in Tomcat (anderer Container) in Eclipse die Option "Nie automatisch veröffentlichen".
  2. Starten Sie Tomcat (anderer Container) im Debug-Modus.

voila! :) :)

Sachin Verma
quelle
0

Klicken Sie in Eclipse im oberen Menü auf das Projekt und stellen Sie sicher, dass "Automatisch erstellen" ausgewählt ist. Dies hat mein Problem behoben. Ich habe Eclipse mit Tomcat unter Verwendung meiner Arbeitsbereich-Metadaten ausgeführt. Ich habe Maven auch in einem Dynamic Web Module-Projekt ausgeführt. Fügen Sie zur Überprüfung Ihre Anwendung zu Tomcat hinzu. Starten Sie Tomcat in Eclipse. Stellen Sie sicher, dass Ihre Anwendung bereitgestellt ist und ausgeführt wird. Öffnen Sie die Registerkarte Konsole in Eclipse. Nehmen Sie eine Änderung in Ihrer Anwendung vor. Nach einigen Sekunden sollte Ihre Änderung automatisch erstellt und für Tomcat bereitgestellt werden.

NLessani
quelle
-2

Am einfachsten und schnellsten: Richten Sie Eclipse so ein, dass beim Erstellen eine WAR-Datei generiert wird. Kopieren Sie diese WAR-Datei nach dem Erstellen in Ihr Tomcat-Webanwendungsverzeichnis. Tomcat erkennt die Änderung und aktualisiert die Site, ohne dass eine Bereitstellung erforderlich ist. Beachten Sie, dass dies nicht perfekt ist. Benutzer, die diese Webanwendung verwenden, haben möglicherweise eine nicht optimale Erfahrung, da Tomcat die Webanwendung "unter" ihnen neu startet. Dies passt jedoch zu Ihrer Anfrage.

Paul Sonier
quelle
1
ok ... Ich glaube, ich habe meine Absichten nicht klar gemacht. Ich bin wirklich nicht daran interessiert, die App für einige Benutzer bereitzustellen, aber ich versuche, einen Tomcat mit Eclipse für meine täglichen Entwicklungsanforderungen auszuführen und den Feedback-Zyklus von (Änderung vornehmen) -> (siehe Ergebnis) anstelle von (Make) zu verkürzen Ändern) -> Bereitstellen -> (Siehe Ergebnis)
udit