web-dev-qa-db-fra.com

Échange à chaud dans Spring Boot

Je fais un P.O.C avec Spring Boot. 

Jusqu'ici, tout se passe très bien et prometteur, mais il y a un inconvénient majeur: j'utilise un serveur intégré (c.-à-d. Empaquetant l'application Web dans un .jar). Ainsi, lors du développement, je dois reconstruire le fichier jar et le redémarrer à chaque fois. Je change les fichiers CSS, HTML ou JS. Il n'y a pas d'échange à chaud. Cela ralentit vraiment le développement de l'interface utilisateur. 

Je peux penser à plusieurs solutions rapides, telles que le chargement de ressources statiques à partir d'un domaine différent et le servir à partir d'une variable nginx locale, et quelques autres variations comme celle-ci, mais n'existe-t-il pas une option intégrée quelconque lorsque vous utilisez IntelliJ/Éclipse? 

33
Amnon

Il y a plusieurs options. Exécuter dans un IDE (en particulier avec le débogage activé) est un bon moyen de faire du développement (tous les IDE modernes permettent le rechargement de ressources statiques et généralement aussi l’échange à chaud des modifications de classes Java). Spring Boot devtools est un moyen peu coûteux d’obtenir un bon coup de pouce (ajoutez-le simplement à votre chemin de classe). Cela fonctionne en redémarrant votre application dans une JVM chaude lorsque des modifications sont détectées. Il désactive également des éléments tels que les caches thymeleaf pendant son exécution, de sorte que vous n’ayez pas à vous rappeler de le faire vous-même. Vous pouvez l'utiliser avec un processus de compilation externe css/js si vous écrivez ce code avec des outils de niveau supérieur.

Spring Loaded n'est plus recommandé, mais probablement encore utilisé. Des outils basés sur des agents plus sophistiqués fonctionnent beaucoup mieux si vous avez besoin d'un échange à chaud avec un délai zéro (par exemple, JRebel).

Voir le docs pour un contenu à jour

22
Dave Syer

Vous pouvez obtenir un échange à chaud:

  • pour le code Java: en utilisant à ressort
  • pour les modèles Thymeleaf: désactiver le cache

Consultez cet article pour plus de détails: http://blog.netgloo.com/2014/05/21/hot-swapping-in-spring-boot-with-Eclipse-sts/

7
Fred K

quels sont les avantages de IntelliJ/Eclipse?

Dans IntelliJ 15.0, fenêtres 10, cliquez ici pour afficher le texte suivant: English | English | Вледуая

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

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

2АГ 2:Затем из Fichier-> Paramètres-> Build-Execution-Deployment -> Compilateur (

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

АГ 3:УдерживатьShift+Ctrl+A(на окнах) вы увидите диалоговое окно поиска с заголовком " Дважды щелкните первый вариант de la part de "Registry ...", cliquez ici Détails du produit:

compiler.automake.allow.when.app.running

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

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

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

6
shabby

Dans Intellij, je peux avoir ce comportement. Lorsque le programme s'exécute en mode débogage, sélectionnez Run > Reload Changed Classes

Remarque: une fois l'action terminée, Intellij peut indiquer Loaded classes are up to date. Nothing to reload. Ceci est trompeur, car cela DID recharge vos ressources de chemin de classes.

Mon environnement/configuration comprend:
Intellij 13
Tomcat intégré
Configuration Run/Debug de type 'Application' (qui utilise simplement une classe principale)
Servant des fichiers html, css et js statiques (pas de jsp) 

5
dgtc

En supposant que vous utilisez gradle; utilisez la configuration suivante dans votre 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"

Exécutez l'application à partir de IDE ou de la ligne de commande à l'aide de la commande gradle build run

Maintenant, IDE peut se connecter à la machine virtuelle Java distante (sur le port 7000) où l'application de démarrage à ressort s'exécute. Il prend également en charge le déploiement à chaud de fichiers statiques.

ou même vous pouvez exécuter la classe principale à partir d’intelliJ si les dépendances sont correctement gérées dans l’EDI. La classe principale est la classe qui contient la méthode main qui appellera SpringApplication.run("classpath:/applicationContext.xml", args); 

5
astronauthere

Vous pouvez également utiliser JRebel - il rechargera tous les changements (meilleur échappement à chaud), y compris les haricots de printemps. Il s'intègre facilement avec Intellij et Eclipse.

5
Jakub Kubrynski

Je ne sais pas jusqu'où va ce type d'assistance, mais si vous utilisez Eclipse IDE (ou toute personne qui lit ceci): démarrez votre application Spring-Boot via m2e en mode debug (appuyez sur le bouton Bouton de "débogage" et choisissez votre élément de configuration d’exécution maven).

Cela fonctionne pour moi comme un charme.

Mon élément de configuration d'exécution maven est configuré comme suit:

  • l'objectif est défini sur "spring-boot: run"
  • le répertoire de base est le répertoire du projet

J'utilise n'utilise pas d'autres bibliothèques (même pas spring-boot-devtools).

C'est tout.

3
Igor

Je recommande Thymeleaf (moteur de modèle), jRebel pour développeur personnel . Les fichiers de modèle Thymeleaf ne sont que des ressources HTML. Ainsi, ils sont modifiés immédiatement après la modification des fichiers de modèle.

2
Jason Im

essayez d'utiliser cette balise spring-boot-devtools dans pom.xml

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

À partir de 1.3.0. (maintenant dans Milestone 2), vous pouvez utiliser spring-boot-devtools à cet effet comme une approche lightweigt - voir le docs ou cet article de blog . Passez simplement à> = 1.3.0 . et ajoutez ce qui suit à votre pom.xml:

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

Alors démarrez votre SpringBootApplication avec Run As ... et tout va bien.

1
jonashackt

Si vous utilisez maven, le plug-in spring-boot-maven-plugin de votre pom.xml doit être comme ceci pour obtenir l'échange à chaud

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

et si vous utilisez thymeleaf, ajoutez ceci aux propriétés de votre application:

spring.thymeleaf.cache=false

Mais souvenez-vous de quelque chose: n'utilisez pas ceci dans votre environnement de production.

0
Rafael Lima

Comment effectuer un remplacement à chaud dans l'application Springboot

  1. Lorsque vous utilisez gradle, incluez les éléments suivants dans la dépendance: compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '2.0.1.RELEASE' & providedRuntime('org.springframework.boot:spring-boot-starter-Tomcat')

  2. Dansapplication.propertiesajoutez la propriété spring.devtools.restart.additional-paths=.

  3. Construisez Gradle puis exécutez l'application en tant que bootRun

L'application est prête à effectuer un échange à chaud lors de la modification de classes.

0
Amey