Zum Hauptinhalt springen

Hotswap 26.02

In ChatGPT öffnen

Ein Hotswap-Tool wendet Änderungen an kompilierten Klassen auf die laufende App an, ohne sie neu zu starten. Der Zustand der App bleibt zwischen den Aktualisierungen erhalten. Das Tool wird in der Konfiguration des webforJ-Build-Plugins angegeben und angehängt, wenn der Build die App startet. Der Ausführungsbefehl bleibt unverändert, und im Projekt muss keine Abhängigkeit dafür deklariert werden.

Es werden zwei Tools unterstützt:

  • HotswapAgent ist Open Source. Das Build-Plugin lädt den Agent beim ersten Ausführen herunter und speichert ihn im Cache.
  • JRebel ist ein kommerzielles Produkt. Es erfordert eine eigene Installation und Lizenz.

Konfigurieren Sie genau eines davon. Ein Build, in dem beide angegeben sind, schlägt mit einem Fehler fehl, der beide nennt.

HotswapAgent​

Ein leeres Element ist eine vollständige Konfiguration:

pom.xml
<plugin>
<groupId>com.webforj</groupId>
<artifactId>webforj-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<hotswap>
<hotswapAgent/>
</hotswap>
</configuration>
</plugin>

Zwei Optionen ermöglichen eine genauere Konfiguration des Anbindens:

OptionBeschreibung
versionEine bestimmte Agent-Version anstelle der vom Plugin ausgewählten Version.
pathEine Agent-JAR-Datei auf dem Datenträger, die direkt und ohne Download verwendet wird. Für Rechner ohne Netzwerkzugriff oder für einen benutzerdefinierten Agent-Build.
pom.xml
<hotswap>
<hotswapAgent>
<path>/path/to/hotswap-agent.jar</path>
</hotswapAgent>
</hotswap>

Änderungen an der Klassenstruktur​

Änderungen am Methodenrumpf werden auf jeder Java Virtual Machine angewendet. Änderungen an der Struktur einer Klasse, etwa ein neues Feld oder eine neue Methode, erfordern eine Virtual Machine, die die Option -XX:+AllowEnhancedClassRedefinition akzeptiert. Diese wird von der JetBrains Runtime bereitgestellt. Der Build erkennt diese Fähigkeit und aktiviert sie. Informationen zur Installation einer JetBrains Runtime finden Sie unter Voraussetzungen.

Ohne diese Fähigkeit werden Änderungen am Methodenrumpf weiterhin angewendet; eine Änderung der Klassenstruktur wird jedoch erst nach einem Neustart in der laufenden App wirksam. Das Build-Protokoll gibt eine Warnung mit der erforderlichen Voraussetzung aus, und im Browser wird einmalig ein Hinweis angezeigt.

JRebel​

JRebel ist ein kommerzielles Produkt, das vom Anbieter lizenziert wird. webforJ stellt es nicht bereit, lädt es nicht herunter und ist nicht an der Lizenzierung beteiligt. Der Build liest den konfigurierten Pfad, prüft, ob die Datei vorhanden ist, und bindet sie unverändert ein.

Verweisen Sie in der Konfiguration auf den Agent aus Ihrer JRebel-Installation – entweder eine native Bibliothek oder eine JAR-Datei:

pom.xml
<hotswap>
<jrebel>
<path>/path/to/libjrebel64.dylib</path>
</jrebel>
</hotswap>

Der Pfad ist erforderlich. Ein Build, der JRebel auswählt, ohne diesen Pfad anzugeben, schlägt mit einem Fehler fehl, der auf die fehlende Einstellung hinweist.

Mit JRebel werden alle Klassenänderungen, einschließlich Änderungen der Klassenstruktur, auf jeder Java-Laufzeitumgebung angewendet.

Auswahl über die Befehlszeile​

Die Eigenschaft webforj.hotswap überschreibt die Build-Datei für einen einzelnen Lauf. Zulässige Werte sind hotswapAgent, jrebel und off. Jeder andere Wert führt dazu, dass der Build mit einem Fehler fehlschlägt, der die gültigen Werte auflistet. Bei Auswahl von jrebel muss weiterhin der Agent-Pfad in der Konfiguration angegeben sein.

mvn -Dwebforj.hotswap=off
mvn -Dwebforj.hotswap=hotswapAgent

Änderungen anwenden​

Kompilieren Sie eine Änderung, damit sie in der laufenden App wirksam wird. Speichern Sie die Änderung in einer IDE, die beim Speichern kompiliert, oder starten Sie die Kompilierung in einem zweiten Terminal.

Wenn alle geänderten Klassen zu dem gehören, was auf der aktuellen Seite gerendert wird, wird der betroffene Teil an Ort und Stelle neu aufgebaut, und der App-Zustand bleibt erhalten. Andernfalls wird die gesamte Seite neu geladen: bei einer App ohne Routing, bei einer Klasse außerhalb der gerenderten Routen oder wenn der Neuaufbau nicht ausgeführt werden kann. Eine kompilierte Änderung führt zu genau einer Aktualisierung im Browser.

Neuladevorgänge in IntelliJ IDEA beschleunigen​

IntelliJ IDEA kompiliert nur dann beim Speichern, wenn automatische Builds aktiviert sind, und wartet vor jedem Schritt. Verkürzen Sie die Wartezeiten, damit eine Änderung schneller in der laufenden App wirksam wird.

Automatische Builds aktivieren​

Öffnen Sie die Einstellungen und aktivieren Sie die folgenden Optionen:

  1. Aktivieren Sie unter Build, Execution, Deployment > Compiler die Option Build project automatically.
  1. Aktivieren Sie unter Advanced Settings > Compiler die Option Allow auto-make to start even if developed application is currently running.
  1. Aktivieren Sie unter Appearance & Behavior > System Settings im Abschnitt Autosave die Option Save files if the IDE is idle for und stellen Sie den Wert auf 1 Sekunde ein.

Drücken Sie Ctrl+ALt+S oder wählen Sie File > Settings.

Build-Verzögerungen verkürzen​

Legen Sie für die folgenden Registry-Schlüssel den Wert 0 fest:

SchlüsselBeschreibung
compiler.automake.trigger.delayDie Verzögerung zwischen einer Dateiänderung und dem Start eines Builds.
compiler.automake.build.while.idle.timeoutDie Leerlaufzeit, bevor ein Build gestartet wird.
compiler.automake.postpone.when.idle.less.thanDie Leerlaufzeit, unterhalb derer IntelliJ IDEA einen Build aufschiebt.
  1. Drücken Sie Ctrl+Shift+A, um Find Action zu öffnen.
  2. Geben Sie Registry... ein und wählen Sie den entsprechenden Eintrag aus.

Sie können auch zweimal Shift drücken, um Search Everywhere zu öffnen, zum Tab Actions wechseln und Registry eingeben.

Geben Sie im Dialogfeld Registry einen Schlüsselnamen ein, um die Liste zu filtern, und setzen Sie anschließend dessen Wert auf 0.

Warnung

Registry-Einträge sind erweiterte, nicht unterstützte Einstellungen von IntelliJ IDEA. Wählen Sie im Dialogfeld Registry die Option Restore Defaults, um die Standardwerte wiederherzustellen.

Weiterlernen