web-dev-qa-db-de.com

Hot Swapping im Spring Boot

Ich habe ein P.O.C mit Spring Boot gemacht. 

Bisher lief es wirklich gut und vielversprechend, aber es gibt einen großen Nachteil: Ich verwende einen eingebetteten Server (dh die Web-App in einen .jar packen). Bei der Entwicklung muss ich das Glas neu erstellen und den Server jedes Mal neu starten Ich ändere die CSS-, HTML- oder JS-Dateien. Es gibt keinen Hot-Swap. Dadurch wird die Entwicklung der Benutzeroberfläche wirklich verlangsamt. 

Ich kann mir verschiedene schnelle Korrekturen vorstellen, wie statische Ressourcen aus einer anderen Domäne laden und von einer lokalen nginx aus bedienen, und einige weitere Variationen wie diese, aber es gibt keine integrierte Option, wenn Sie mit IntelliJ/arbeiten. Finsternis? 

33
Amnon

Es gibt mehrere Möglichkeiten. Die Ausführung in einer IDE (vor allem bei aktiviertem Debugging) ist eine gute Möglichkeit, die Entwicklung durchzuführen (alle modernen IDEs ermöglichen das Nachladen statischer Ressourcen und normalerweise auch das Hotswapping von Java-Klassenänderungen). Spring Boot devtools ist eine kostengünstige Möglichkeit, einen großen Schub zu erzielen (fügen Sie ihn einfach in Ihren Klassenpfad ein). Es funktioniert, indem Sie Ihre Anwendung in einer heißen JVM neu starten, wenn Änderungen festgestellt werden. Es deaktiviert auch Dinge wie Thymeleaf-Caches, während es ausgeführt wird, sodass Sie nicht daran denken müssen, dies selbst zu tun. Sie können es mit einem externen css/js-Compilerprozess verwenden, wenn Sie diesen Code mit Tools höherer Ebene schreiben.

Spring Loaded wird nicht mehr empfohlen, wird aber wahrscheinlich noch verwendet. Fortschrittlichere agentenbasierte Tools funktionieren viel besser, wenn Sie Hot-Swapping ohne Verzögerung (z. B. JRebel) benötigen.

In der Datei docs finden Sie aktuelle Informationen

22
Dave Syer

Sie können Hot-Swapping erhalten:

  • für Java-Code: Verwenden von federbelastet
  • für Thymeleaf-Vorlagen: Deaktivieren des Caches

Weitere Informationen finden Sie in diesem Beitrag: http://blog.netgloo.com/2014/05/21/hot-swapping-in-spring-boot-with-Eclipse-sts/

7
Fred K

wann möchten Sie im IntelliJ/Eclipse übernachten?

In IntelliJ 15.0, Windows 10, Windows XP:

1АГ 1: Добавлена ​​следующая зависимость в pom (это упоминается повсеместно, нотолько

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
</dependency>

ШАГ 2: Затем из File-> Settings-> Build-Execution-Deployment -> Compiler либо из его суб-опция)

включить Make Project автоматически. Нажмите ок и закройте диалог

3АГ 3: УдерживатьShift+Ctrl+A(In den Warenkorb) In den Warenkorb legen Weitere Informationen finden Sie unter "Registrierung ...", unter "Registrierung". Weitere Informationen:

compiler.automake.allow.when.app.running

и включите его, нажмите кнопку Закрыть

4АГ 4: Перезапустите IDE

Разработано из этого источник

6
shabby

In Intellij kann ich dieses Verhalten bekommen. Wenn das Programm im Debug-Modus ausgeführt wird, wählen Sie Run > Reload Changed Classes aus.

Hinweis: Nachdem Intellij die Aktion abgeschlossen hat, könnte Loaded classes are up to date. Nothing to reload angezeigt werden. Dies ist irreführend, da die Klassenpfadressourcen tatsächlich DID neu geladen werden.

Meine Umgebung/Setup beinhaltet:
Intellij 13
Eingebetteter Tomcat
Run/Debug Konfiguration des Typs 'Application' (der nur eine Hauptklasse verwendet)
Statische HTML, CSS und JS (kein JSP) 

5
dgtc

Angenommen, Sie verwenden gradle; Verwenden Sie die folgende Konfiguration in Ihrem build.gradle

apply plugin: 'Java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'application'

applicationDefaultJvmArgs = ["-agentlib:jdwp=transport=dt_socket,address=localhost:7000,server=y,suspend=n"]

mainClassName = "package.ApplicationRunner"

Führen Sie die Anwendung über die IDE oder die Befehlszeile mit dem Befehl gradle build run aus.

Jetzt kann die IDE eine Verbindung zur Remote-JVM (an Port 7000) herstellen, auf der die Spring Boot-Anwendung ausgeführt wird. Es unterstützt auch das Hot Deployment statischer Dateien.

sie können sogar die Hauptklasse von intelliJ ausführen, wenn die Abhängigkeiten in der IDE ordnungsgemäß verwaltet werden. Die Hauptklasse ist die Klasse, die die Hauptmethode enthält, die SpringApplication.run("classpath:/applicationContext.xml", args); aufruft. 

5
astronauthere

Sie können auch JRebel verwenden - es lädt alle Änderungen (besser Hotswap), einschließlich Spring Beans, nach. Es lässt sich leicht in Intellij und Eclipse integrieren.

5
Jakub Kubrynski

Ich weiß nicht, wie weit diese Art der Unterstützung geht, aber falls Sie Eclipse IDE verwenden (oder jemand, der dies liest): Starten der Spring-Boot-Anwendung über m2e im Debug-Modus ( Klicken Sie auf die Schaltfläche "Debug" und wählen Sie Ihr Maven Run-Konfigurationselement aus.

Es funktioniert für mich wie ein Zauber.

Mein Maven Run-Konfigurationselement ist wie folgt konfiguriert:

  • ziel ist gesetzt auf "Spring-Boot: Run"
  • basisverzeichnis ist das Projektverzeichnis

Ich bin benutze nicht weitere Bibliotheken (nicht einmal Spring-Boot-devtools).

Das ist es.

3
Igor

Ich empfehle Thymeleaf (Template Engine), jRebel für den persönlichen Entwickler . Thymeleaf-Vorlagendateien sind nur HTML-Ressourcen. Sie werden also unmittelbar nach dem Bearbeiten der Vorlagendateien geändert.

2
Jason Im

versuchen Sie es mit diesem Spring-Boot-Devtools-Tag in pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
 </dependencies>
1
vipul gulhane

Ab 1.3.0. (jetzt in Milestone 2) können Sie die Spring-Boot-Devtools dafür als leichtgewichtigen Ansatz verwenden - siehe docs oder this blogpost . Aktualisieren Sie einfach auf> = 1.3.0 . und fügen Sie der pom.xml Folgendes hinzu:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
  </dependency>
</dependencies>

Dann starten Sie Ihre SpringBootApplication mit Run As ... und schon geht es Ihnen gut.

1
jonashackt

Wenn Sie Maven verwenden, muss das Spring-Boot-Maven-Plugin in Ihrer pom.xml so aussehen, um den Hot-Swap zu erhalten:

  <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
                <version>1.2.0.RELEASE</version>
            </dependency>
        </dependencies>
    </plugin>

und wenn Sie Thymeleaf verwenden, fügen Sie dies zu Ihren Anwendungseigenschaften hinzu:

spring.thymeleaf.cache=false

Denken Sie jedoch an etwas: Verwenden Sie dies nicht in Ihrer Produktionsumgebung.

0
Rafael Lima

So führen Sie einen Hot Swap in einer Springboot-Anwendung durch

  1. Wenn Sie Gradle verwenden, schließen Sie Folgendes in die Abhängigkeit ein: compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '2.0.1.RELEASE' & providedRuntime('org.springframework.boot:spring-boot-starter-Tomcat')

  2. Inapplication.propertiesfügen Sie die Eigenschaft spring.devtools.restart.additional-paths=. hinzu.

  3. Erstellen Sie Gradle und führen Sie dann die Anwendung als bootRun aus

Die Anwendung ist bereit, bei Änderungen von Klassen einen Hot-Swap durchzuführen

0
Amey