IntelliJ und Tomcat… geänderte Dateien werden von Tomcat nicht automatisch erkannt

135

Ich führe Intellij Ultimate mit Tomcat aus und setze einen Krieg ein. Alles wird einwandfrei im Webapp-Verzeichnis von Tomcat bereitgestellt.

Gibt es eine Möglichkeit für Tomcat, diese Änderung automatisch zu übernehmen, wenn ich eine Datei wie eine XML-Datei ändere? Ab sofort muss ich die Datei von Intellij kopieren und in das Verzeichnis kopieren, in dem sie sich im Tomcat-Webanwendungsverzeichnis befindet. Ich weiß, dass es bestimmte Dateien gibt, die neu kompiliert werden müssen, aber xhtmls gehören nicht dazu.

Peter
quelle

Antworten:

20

Lassen Sie mich die Abfolge der Aktionen anhand von Screenshots beschreiben:

  1. Öffnen Sie Ihre Tomcat Run / Debug-Konfiguration (Run> Konfigurationen bearbeiten).

Geben Sie hier die Bildbeschreibung ein

  1. Klicken Sie auf das Symbol zum Hinzufügen, wählen Sie "Artefakt" und dann pizza_mvc:war exploded: Geben Sie hier die Bildbeschreibung ein

  2. Ändern Sie "On Update Action" und "On Frame Diactivation": Geben Sie hier die Bildbeschreibung ein

  3. Drücken Sie jedes Mal, wenn Sie Ihre Ressourcen aktualisieren möchten <Ctrl> + F10

Lord Nighton
quelle
Vielen Dank, dass Sie mich daran erinnert haben, "On 'Update' action" zu überprüfen
km1
290

Dies ist nicht möglich, wenn Sie einen Krieg mit IntelliJ IDEA führen. Dies kann jedoch der Fall sein, wenn Sie einen explodierten Krieg einsetzen . In IDEA:

  1. Öffnen Sie Ihre Tomcat Run / Debug-Konfiguration ( Ausführen> Konfigurationen bearbeiten ).
  2. Wechseln Sie zur Registerkarte "Bereitstellung"
  3. Entfernen Sie im Abschnitt "Beim Serverstart bereitstellen" das Artefakt (falls vorhanden) my-webapp-name:war
  4. Klicken Sie auf das Symbol zum Hinzufügen, wählen Sie "Artefakt" und dann "Auswählen" my-webapp-name:war exploded
  5. Klicken Sie auf OK (im Dialogfeld "Zu implementierende Artefakte auswählen").
  6. Wählen Sie im Fenster "Konfiguration ausführen / debuggen" die Registerkarte "Server"
  7. Ändern Sie in der Mitte dieser Registerkarte die Einstellung "Deaktivierung im Frame" in "Ressourcen aktualisieren" oder "Klassen und Ressourcen aktualisieren".
    • Ressourcen aktualisieren : Alle geänderten Ressourcen (dh alle Anwendungskomponenten außer den Klassen) werden aktualisiert.
    • Klassen und Ressourcen aktualisieren : Alle geänderten Ressourcen werden aktualisiert. geänderte Klassen werden neu kompiliert. Beachten Sie, dass es von den Funktionen des Webservers abhängt, ob die tatsächlichen Klassen aktualisiert werden. Wenn ich mich recht erinnere, lädt Tomcat HTML- / XHTML- und JSP-Dateien neu, jedoch keine Servlets oder Klassen, die von JSPs oder Servlets verwendet werden. Sie müssen Tomcat ändern, um dafür einen dynamischen Klassenladeprogramm zu verwenden.
  8. Sie können auch die Aktion " Bei Aktualisierung " auf die oben ausgewählte Aktion einstellen .
    • Dadurch wurde festgelegt, was passiert, wenn Sie im Ausführungsfenster auf das Aktualisierungssymbol Update-Symbol(oder Ctrl+ F10) klicken.
    • Der "Dialogfeld anzeigen" bestimmt, ob IDEA Sie jedes Mal auffordert, wenn Sie auf das Aktualisierungssymbol klicken
  9. OK klicken.

Jedes Mal, wenn Sie eine Änderung vornehmen, stellt IDEA die geänderten Dateien erneut bereit, wenn der IDEA-Frame deaktiviert ist (dh den Fokus verliert). Es dauert ein oder zwei Sekunden. Sie sehen es in der unteren Statusleiste von IDEA. Offensichtlich. Sie müssen Ihren Webbrowser noch aktualisieren, damit er die neue Datei abruft (es sei denn, die Seite verfügt über eine automatische Aktualisierung von Ajax wie Fetch).

Eine gute Kombination mit Tomcat besteht darin, "On-Frame-Deaktivierung" auf "Ressourcen aktualisieren" und die Aktion "Bei Aktualisierung" entweder auf "Neu bereitstellen" oder "Server neu starten" zu setzen. Dadurch können statische Seiten schnell über Frame-Deaktivierung aktualisiert werden Klasse über die Aktion 'Update' aktualisiert.

Ein Unternehmen namens ZeroTurnaround verkauft JRebel , eine dynamische Classloader-Lösung. Sie haben auch eine fünfteilige Serie zu diesem Thema , die sehr gut ist.

Javaru
quelle
Ich habe einen Fehler: Error: Artifact 'my-webapp-name:war exploded' has invalid extensionWie behebe ich das ?
Anton Dozortsev
3
Ich empfehle außerdem dringend, DCEVM für das automatische Neuladen von Klassen zu verwenden. Sie können dann "Klassen und Ressourcen aktualisieren" verwenden, um Änderungen am Quellcode zu übernehmen, ohne die Anwendung erneut bereitzustellen. Siehe: blog.jetbrains.com/idea/2013/07/… . Zusätzlich zu den Erläuterungen in diesem Lernprogramm muss JAVA_HOME auf der Registerkarte Setup / Connection - Debug der Tomcat Run Configuration so festgelegt werden, dass es auf die JRE des DCEVM verweist.
Alex Fedulov
1
@yaroslavprokipchyn - Ich bin nicht mit JBoss und den "besonderen" Anforderungen vertraut, die es möglicherweise hat. Aber soweit ich weiß, sollte es genauso funktionieren. Für Tomcat erstellt IDEA eine Tomcat-Konfiguration (context.xml), die Tomcat anweist, das Zielverzeichnis / {contextName} als Webanwendungsstammverzeichnis zu verwenden. Möglicherweise möchten Sie in der Hilfe nach JBOss-spezifischen Informationen suchen.
Javaru
3
In Schritt 7 erhalten Sie (zumindest in Intellij 14) nicht die entsprechenden Dropdown-Optionen, es sei denn, Sie haben alle Ihre Artefakte als "explodiert" geladen.
Mortensi
1
@ChiefTwoPencils - In Schritt 5 klicken Sie im Dialogfeld "Zu implementierende Artefakte auswählen" (für das es kein "Anwenden" gibt) auf OK, nicht im Konfigurationsfenster Ausführen / Debuggen. Ich habe Schritt 5 eine klarstellende Erklärung hinzugefügt.
Javaru
12

Wenn Sie Klassen und Ressourcen aktualisieren möchten, führen Sie Tomcat im Debug-Modus aus . In diesem Modus aktualisiert IntelliJ Klassen und Ressourcen problemlos (Hot-Swap).

Habe das gleiche Problem. IntelliJ hat mein Projekt nicht aktualisiert, da ich als "Ausführungsmodus" ausgeführt werde. Wenn ich im Debug-Modus laufe und Ctrl+ drücke F10, werden Klassen und Ressourcen aktualisiert.

Łukasz Woźniak
quelle
Control-F10 hat das Problem für mich behoben. Danke dir!
Jeffrey Getzin
3

Ich habe einen besseren Weg gefunden.

In Eclipse haben wir automatisch statische Dateien erstellt, kompiliert und neu geladen. Tatsächlich werden statische Dateien direkt von src / main / webapp bereitgestellt .

In IntelliJ wird anstelle der direkten Bereitstellung von src / main / webapp ein Ordner im Ziel erstellt, in dem Sie eine Kopie Ihrer src / main / webapp und anderer kontextbezogener Dateien haben . Web-inf / classes / lib.

Wenn Sie anstelle des Ziels setzen die Ausgabe von explodierten Artefakt src / main / webapp , wird es nicht überschreiben Sie Quelldateien, und es wird direkt dienen, Sie werden nicht getroffen haben - Update Ressourcen / update Ressourcen und Klassen

Was Sie also in IntelliJ tun müssen, ist

  1. Ändern Sie das Ausgabeverzeichnis für explodierte Artefakte in src / main / webapp Geben Sie hier die Bildbeschreibung ein
  2. Erstellen Sie ein Makro zum Speichern und Neukompilieren / Kompilieren von Dirty-Klassen (cmd + shift + f9). Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein
  3. Bearbeiten Sie die Registrierung und die Einstellungen, um sie automatisch zu erstellen und während die App ausgeführt wird (cmd + shift + a - Registrierung). Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Wenn Sie danach Jobs haben, die statische Dateien von außerhalb von IntelliJ ändern, werden Änderungen sofort angezeigt, ohne zu IntelliJ zu wechseln und Ressourcen zu aktualisieren. Für die Klassen haben Sie das Makro, das gespeichert und kompiliert wird (Hinweis: Sie können auch einfach auf Kompilieren klicken / Neukompilieren: cmd + shift + F9 / cmd + F9 - Wenn Sie mehrere Editoren geöffnet haben, werden Ihre schmutzigen * Editoren nicht schmutzig sein und Änderungen (Klassen) werden neu geladen.)

Radu Toader
quelle
Wenn Sie die Registrierung compiler.automake .. aktiviert haben, werden Ihre Änderungen anscheinend nur durch Klicken auf Speichern übertragen.
Radu Toader
0

Dies ist nur möglich, wenn Sie den explodierten Kriegsordner bereitstellen, das Hot-Reloading aktivieren und Tomcat im Debug-Modus starten.

Dies sind die Schritte, um dies zu erreichen.

  1. Öffnen Sie Ihre Tomcat Run / Debug-Konfiguration (Ausführen> Konfigurationen bearbeiten).
  2. Gehen Sie zur Registerkarte "Bereitstellung". 3. Entfernen Sie im Abschnitt "Beim Serverstart bereitstellen" (falls vorhanden) das Artefakt my-webapp-name: war
  3. Klicken Sie auf das Symbol zum Hinzufügen, wählen Sie "Artefakt" und dann "my-webapp-name: war exploded"
  4. Klicken Sie auf OK (im Dialogfeld "Zu implementierende Artefakte auswählen").
  5. Wählen Sie im Fenster "Konfiguration ausführen / debuggen" die Registerkarte "Server"
  6. Ändern Sie die Einstellungen "On Frame Deactivation" und "On Update Action" in "Klassen und Ressourcen aktualisieren".
  7. Übernehmen und speichern
  8. Gehen Sie zu den normalen Projekteinstellungen, indem Sie auf Datei und dann auf Einstellungen klicken ODER STRG + ALT + S drücken
  9. gehe zu "Erstellen, Ausführen, Bereitstellen"
  10. Compiler
  11. Wählen Sie Projekt automatisch erstellen
  12. sparen
  13. Starten Sie Tomcat im Debug-Modus
Adindu Stevens
quelle
0

Wenn Sie mehrteilige Dateien haben, die Sie sofort anzeigen / abspielen möchten, laden Sie sie direkt in den Zielordner hoch. * (Ändere nur den Schreibort in den Zielordner / static /)

String yourpath = C\\andSoForth
    yourPath + "\\target\\classes\\static\\uploads\\audiofiles\\"

Sie können Ihre Datei sofort anzeigen, ohne Ihre IDE neu starten zu müssen

Esther
quelle