Hotswap 26.02
Ein Hotswap-Tool wendet compilierte Klassenänderungen auf die laufende Anwendung an, ohne sie neu zu starten. Die Anwendung behält ihren Zustand zwischen den Aktualisierungen. Das Tool wird in der Konfiguration des webforJ-Build-Plugins benannt und wird aktiv, wenn der Build die Anwendung startet. Der Ausführungsbefehl bleibt gleich, und das Projekt gibt keine Abhängigkeit dafür an.
Es werden zwei Tools unterstützt:
- HotswapAgent ist Open Source. Das Build-Plugin lädt den Agenten beim ersten Ausführen herunter und cached ihn.
- JRebel ist ein kommerzielles Produkt. Es erfordert Ihre eigene Installation und Lizenz.
Konfigurieren Sie genau eines. Ein Build, das beide benennt, schlägt mit einem Fehler fehl.
HotswapAgent
Ein leeres Element ist eine vollständige Konfiguration:
- Maven
- Gradle
<plugin>
<groupId>com.webforj</groupId>
<artifactId>webforj-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<hotswap>
<hotswapAgent/>
</hotswap>
</configuration>
</plugin>
webforj {
hotswap {
hotswapAgent {}
}
}
Zwei Optionen verfeinern die Anbindung:
| Option | Beschreibung |
|---|---|
version | Eine spezifische Agentversion anstelle der vom Plugin ausgewählten. |
path | Eine Agent-JAR auf der Festplatte, die direkt ohne Download verwendet wird. Für Maschinen ohne Netzwerkzugang oder für einen benutzerdefinierten Agentenbuild. |
- Maven
- Gradle
<hotswap>
<hotswapAgent>
<path>/path/to/hotswap-agent.jar</path>
</hotswapAgent>
</hotswap>
webforj {
hotswap {
hotswapAgent {
path = file('/path/to/hotswap-agent.jar')
}
}
}
Änderungen der Klassenstruktur
Änderungen des Methodenkörpers gelten auf jeder Java Virtual Machine. Änderungen an der Struktur einer Klasse, wie ein neues Feld oder eine neue Methode, erfordern eine virtuelle Maschine, die die Option -XX:+AllowEnhancedClassRedefinition akzeptiert, die von der JetBrains Runtime bereitgestellt wird. Der Build erkennt die Fähigkeit und aktiviert sie. Siehe Voraussetzungen für die Installation einer JetBrains Runtime.
Ohne diese Fähigkeit gelten die Änderungen des Methodenkörpers weiterhin, und eine Änderung der Klassenstruktur erreicht die laufende Anwendung nicht, bis eine Neuladung erfolgt. Das Build-Log gibt eine Warnung aus, die die Anforderung benennt, und der Browser zeigt einmal eine Benachrichtigung an.
JRebel
JRebel ist ein kommerzielles Produkt, das von seinem Anbieter lizenziert ist. webforJ schickt es nicht mit, lädt es nicht herunter und nimmt keine an seinem Lizenzwesen teil. Der Build liest den konfigurierten Pfad, überprüft, dass die Datei vorhanden ist, und schließt sie unverändert an.
Richten Sie die Konfiguration auf den Agenten Ihrer JRebel-Installation, einer nativen Bibliothek oder einer JAR:
- Maven
- Gradle
<hotswap>
<jrebel>
<path>/path/to/libjrebel64.dylib</path>
</jrebel>
</hotswap>
webforj {
hotswap {
jrebel {
path = file('/path/to/libjrebel64.dylib')
}
}
}
Der Pfad ist erforderlich. Ein Build, der JRebel ohne diesen auswählt, schlägt mit einem Fehler fehl, der die fehlende Einstellung benennt.
Mit JRebel gelten alle Klassenänderungen, einschließlich Strukturänderungen, auf jeder Java-Laufzeit.
Command Line-Auswahl
Die webforj.hotswap-Eigenschaft überschreibt die Build-Datei für einen einzelnen Lauf. Akzeptierte Werte sind hotswapAgent, jrebel und off. Jeder andere Wert führt zu einem Build-Fehler mit einer Fehlerausgabe zur Auflistung der gültigen Werte. Die Auswahl von jrebel erfordert weiterhin den Agentenpfad in der Konfiguration.
- Maven
- Gradle
mvn -Dwebforj.hotswap=off
mvn -Dwebforj.hotswap=hotswapAgent
./gradlew bootRun -Pwebforj.hotswap=off
./gradlew bootRun -Pwebforj.hotswap=hotswapAgent
Anwenden einer Änderung
Kompilieren Sie eine Änderung, und sie erreicht die laufende Anwendung. Speichern Sie in einer IDE, die beim Speichern kompiliert, oder führen Sie eine Kompilierung in einem zweiten Terminal aus.
Wenn jede geänderte Klasse zu dem gehört, was die aktuelle Seite rendert, wird der betroffene Teil vor Ort neu aufgebaut und der Anwendungszustand bleibt bestehen. Andernfalls wird die Seite vollständig neu geladen: für eine Anwendung ohne Routing, für eine Klasse außerhalb der gerenderten Routen oder wenn der Neubau nicht durchgeführt werden kann. Eine kompilierte Änderung ergibt ein Update im Browser.