Comment accélérer le développement sur Spring Boot avec DevTools et rendre ce processus plus agréable et plus productif?
Personnalisation
Comme d'habitude lors du développement sur Spring Boot, la configuration est assez simple. Tout ce que vous avez à faire est d'ajouter la bonne dépendance et vous avez terminé. Spring Boot le trouve et configure automatiquement DevTools en conséquence.
Si vous utilisez Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
Si vous utilisez Gradle:
configurations { developmentOnly runtimeClasspath { extendsFrom developmentOnly } } dependencies { developmentOnly("org.springframework.boot:spring-boot-devtools") }
Veuillez noter que la dĂ©pendance est dĂ©clarĂ©e comme facultative. Ceci est important car une telle dĂ©claration de dĂ©pendance empĂȘche la dĂ©pendance DevTools d'ĂȘtre appliquĂ©e de maniĂšre transitoire Ă d'autres modules en fonction de votre projet.
Redémarrage automatique
Chaque fois que des modifications de fichier se produisent dans votre chemin de classe, DevTools redĂ©marrera automatiquement votre application de travail avec les nouvelles modifications. Pour le dĂ©veloppement local, cela peut ĂȘtre utile car vous n'avez pas besoin de redĂ©ployer l'application manuellement.
Cela seul ne serait pas aussi utile, car le redémarrage peut encore prendre trop de temps. Heureusement, un tel redémarrage est beaucoup plus rapide qu'un redémarrage normal en raison de l'astuce délicate utilisée par DevTools.
Le fait est que lorsque vous développez une application, vous changez généralement une classe ou plusieurs et souhaitez vérifier les résultats dans votre application en cours d'exécution pour obtenir des commentaires. Vous apportez des modifications mineures à votre application, tandis que la plupart des classes chargées proviennent de frameworks et de bibliothÚques tierces.
Sous le capot de Spring DevTools, deux chargeurs de classe sont utilisés: la
base et le
redémarrage . Les classes qui ne changent pas sont chargées par la base du chargeur de
base . Les classes avec lesquelles vous travaillez sont chargées à l'aide du chargeur de
redĂ©marrage . Chaque fois que vous redĂ©marrez, le chargeur de dĂ©marrage est recréé. Ainsi, le redĂ©marrage de l'application est beaucoup plus rapide que d'habitude et peut ĂȘtre une vĂ©ritable alternative au rechargement d'une classe dynamique Ă l'aide d'outils tels que JRebel.
Initialisation du redémarrage dans IDE
Un redémarrage est déclenché chaque fois qu'un fichier change dans votre chemin de classe. Cependant, ce processus dépend de votre IDE. Cela signifie qu'il ne suffit pas de modifier vos fichiers java. L'important est lorsque votre IDE met réellement à jour les fichiers .class dans votre chemin de classe.
Lorsque vous utilisez IntelliJ IDEA, vous devez exécuter la commande build dans votre projet (
Ctrl + F9 ou
Build â Build Project ). Vous pouvez Ă©galement
configurer la commande build pour qu'elle s'exécute automatiquement dans IDEA . De plus, vous pouvez ouvrir la configuration de démarrage de Spring Boot et déterminer ce qui se passe lorsque la mise à jour de l'application démarre (
Ctrl + F10 ):

Dans la premiÚre zone de liste déroulante, vous pouvez sélectionner
Mettre à jour le fichier déclencheur pour démarrer le redémarrage de DevTools chaque fois que l'action de
mise Ă jour est effectuĂ©e. Alternativement, vous pouvez mĂȘme sĂ©lectionner l'option de remplacement Ă
chaud et essayer de redĂ©marrer l'application Ă l'aide de DevTools uniquement si l'exĂ©cution du remplacement Ă
chaud a échoué.
Dans la deuxiĂšme zone de liste dĂ©roulante, vous pouvez configurer le redĂ©marrage de toutes les ressources statiques et modĂšles lorsque la fenĂȘtre IDEA perd le focus (par exemple, lors du basculement vers la fenĂȘtre du navigateur).
Dans Eclipse, il est assez facile d'enregistrer vos fichiers.
Développement uniquement
Les Spring Boot DevTools sont destinés uniquement au développement et non au fonctionnement de production de l'application. Si votre application détecte que vous travaillez dans un environnement de production, DevTools est automatiquement désactivé.
à cet effet, chaque fois que vous lancez votre application en tant qu'artefact entiÚrement packagé, tel qu'un pot avec un serveur d'applications intégré, elle est considérée comme une application de production:
java -jar devtools-example-1.0.0.jar
Il en va de mĂȘme lorsque votre application est lancĂ©e via un chargeur de classe spĂ©cial, par exemple, sur un serveur d'applications.
Au contraire, lorsque vous exĂ©cutez des artefacts dĂ©compressĂ©s (par exemple, dans votre IDE), votre application est considĂ©rĂ©e en mode dĂ©veloppement. La mĂȘme chose s'applique Ă l'utilisation de Spring-Boot-Plugin pour exĂ©cuter l'application:
Maven:
mvn spring-boot:run
Gradle:
gradle bootRun
LiveReload
LiveReload est un outil utile qui vous permet d'actualiser instantanĂ©ment une page dans un navigateur chaque fois que vous apportez des modifications Ă des fichiers tels que HTML, CSS, images, etc. Il prĂ©traite mĂȘme les fichiers selon les besoins - cela signifie la compilation automatique des fichiers SASS ou LESS.

Spring DevTools démarre automatiquement une instance locale du serveur LiveReload qui suit vos fichiers. Tout ce que vous avez à faire est d'installer l'
extension pour le navigateur , et vous avez terminĂ©. Il est non seulement utile pour dĂ©velopper l'interface externe de votre application (dans le cas oĂč vous la distribuez dans le cadre de l'artefact de l'application Spring), mais peut Ă©galement ĂȘtre utilisĂ© pour surveiller et recharger la sortie de votre API REST.
Remplacement de la propriété
Lorsque vous dĂ©veloppez une application localement, vous avez gĂ©nĂ©ralement des besoins de configuration diffĂ©rents que lorsque vous travaillez dans un environnement de production. Un exemple serait la mise en cache. Dans un environnement de production, la dĂ©pendance Ă l'Ă©gard de divers caches (tels que les caches de modĂšles de moteur, les en-tĂȘtes de mise en cache pour les ressources statiques, etc.) est extrĂȘmement importante. Pendant le dĂ©veloppement, il peut utiliser d'anciennes donnĂ©es et ne pas reflĂ©ter vos derniĂšres modifications. Un autre exemple serait la journalisation avancĂ©e, qui peut ĂȘtre utile en dĂ©veloppement mais trop dĂ©taillĂ©e pour l'environnement de production.
Il est trop difficile de gĂ©rer vous-mĂȘme deux types de configuration. La bonne nouvelle est que Spring Boot DevTools, par dĂ©faut, configure de nombreuses propriĂ©tĂ©s pour votre dĂ©veloppement local.
spring.thymeleaf.cache=false spring.freemarker.cache=false spring.groovy.template.cache=false spring.mustache.cache=false server.servlet.session.persistent=true spring.h2.console.enabled=true spring.resources.cache.period=0 spring.resources.chain.cache=false spring.template.provider.cache=false spring.mvc.log-resolved-exception=true server.servlet.jsp.init-parameters.development=true spring.reactor.stacktrace-mode.enabled=true
Vous pouvez trouver une liste de toutes les propriétés de la classe
DevToolsPropertyDefaultsPostProcessor .
Connexion Ă distance
En plus du dĂ©veloppement local, vous pouvez Ă©galement vous connecter Ă une application distante exĂ©cutant DevTools. Cet outil n'est pas destinĂ© aux environnements de production car il peut prĂ©senter un risque sĂ©rieux pour la sĂ©curitĂ©. Cependant, il peut ĂȘtre trĂšs utile dans un environnement de prĂ©-production.
Activation de la connexion Ă distance
La connexion à distance n'est pas activée par défaut. Vous devez l'activer explicitement en modifiant le fichier pom:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludeDevtools>false</excludeDevtools> </configuration> </plugin> </plugins> </build>
Ou avec gradle, vous devez définir
excludeDevtools = false :
bootWar { excludeDevtools = false }
Ensuite, vous devez définir un mot de passe qui sera utilisé pour l'authentification lors de la connexion à l'application distante:
spring.devtools.remote.secret=somesecret
Se connecter Ă une application distante
AprÚs avoir démarré l'application distante, vous pouvez démarrer la session de connexion à distance. Il ne vous reste plus qu'à exécuter
org.springframework.boot.devtools.RemoteSpringApplication avec l'URL de votre application distante comme argument. Veuillez noter que vous devez utiliser
https si possible.
Le démarrage d'une connexion à distance est facile dans votre IDE. Dans IDEA, il vous suffit de créer une nouvelle configuration de lancement. Allez dans
ExĂ©cuter â Modifier les configurations ... et crĂ©ez une nouvelle configuration avec l'icĂŽne
+ dans le coin supérieur gauche. Sélectionnez un type d'application.
Pour la classe Main, sélectionnez
RemoteSpringApplication dans le module DevTools et passez l'URL de votre application distante comme argument au programme.

AprÚs avoir démarré cette configuration, vous devriez voir une sortie similaire si la connexion à l'application distante a réussi.

AprĂšs la connexion Ă une application distante, DevTools surveille les modifications du chemin d'accĂšs aux classes de la mĂȘme maniĂšre que pour le dĂ©veloppement local. Cependant, au lieu d'un redĂ©marrage local, il transfĂšre les modifications sur le serveur distant et y initie un redĂ©marrage. Cela peut ĂȘtre beaucoup plus rapide que de crĂ©er une application et de la dĂ©ployer sur une machine distante.
Configuration globale
Vous pouvez personnaliser DevTools à l'aide des propriétés de configuration, comme avec toute autre application Spring. Cela signifie généralement modifier les propriétés
application.properties de votre projet. Cette configuration est distincte pour chaque application.
Cependant, dans certains scĂ©narios, il peut ĂȘtre pratique d'avoir une configuration globale pour TOUTES les applications exĂ©cutĂ©es sur le mĂȘme ordinateur. Vous pouvez crĂ©er un fichier de propriĂ©tĂ©s appelĂ©
.spring-boot-devtools.properties situé dans votre répertoire
$ HOME . La déclaration indiquée dans ce fichier s'applique à toutes les applications utilisant DevTools.
Limitations
Rechargement en direct
Une application Spring utilisant DevTools dĂ©marre automatiquement le serveur LiveReload. Malheureusement, une seule instance de ce serveur peut ĂȘtre dĂ©marrĂ©e Ă la fois. Plus prĂ©cisĂ©ment, seule la premiĂšre instance fonctionnera. Cela s'applique non seulement Ă plusieurs instances d'applications Spring avec DevTools, mais Ă©galement Ă toutes les autres applications qui utilisent Ă©galement LiverReload sous le capot, comme
Gatsby en mode développement.
Si vous souhaitez configurer l'application Spring afin qu'elle ne dĂ©marre pas le serveur LiveReload, cela peut ĂȘtre fait dans votre fichier
application.properties :
spring.devtools.livereload.enabled=false
Crochet d'arrĂȘt
Les DevTools dépendent de l'attribut de
hook d'arrĂȘt de la classe
SpringApplication . La classe ne fonctionnera pas correctement si vous avez désactivé manuellement l'attribut à l'aide de:
springApplication.setRegisterShutdownHook(false);
L'attribut est activé par défaut, vous n'avez donc pas à vous en préoccuper sauf si vous le désactivez explicitement.
Collisions avec des bibliothĂšques tierces
Bien que DevTools devrait généralement fonctionner correctement, ils peuvent avoir des conflits avec des bibliothÚques tierces. En particulier, il existe un problÚme connu de désérialisation à l'aide de l'
ObjectInputStream standard.
En cas d'un tel conflit, vous pouvez désactiver le redémarrage automatique en définissant:
spring.devtools.restart.enabled=false
Le redémarrage ne fonctionnera plus. Cependant, le
redémarrage du chargeur de classe sera toujours utilisé. Si vous devez désactiver complÚtement le chargeur de classe, vous devez le faire avant de démarrer l'application:
public static void main(String[] args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(MyApp.class, args); }
MĂȘme si vous n'utilisez pas le redĂ©marrage automatique, vous pouvez toujours utiliser d'autres fonctionnalitĂ©s DevTools.
Activation de l'initialisation différée
Vous pouvez marquer des composants individuels comme initialisés paresseusement à l'aide d'annotations
. Cette fonctionnalité est disponible depuis un certain temps. à partir de Spring Boot 2.2, vous pouvez basculer l'initialisation différée pour tous vos composants de bean en utilisant
spring.main.lazy-initialization = true .
Cela peut ĂȘtre utilisĂ© seul ou
en combinaison avec DevTools pour un redémarrage encore plus rapide .
DevTools vous permet de redĂ©marrer Ă chaud votre application dans la mĂȘme JVM. Un avantage significatif d'un redĂ©marrage Ă chaud est qu'il donne Ă JIT plus d'options pour optimiser le code utilisĂ© pour lancer votre application. AprĂšs plusieurs redĂ©marrages, le temps initial de 2500 ms est rĂ©duit de prĂšs de 80% et approche 500 ms. Avec une initialisation paresseuse, nous pouvons obtenir de meilleurs rĂ©sultats. Lors de l'installation de
spring.main.lazy-initialization, notre application redémarre aprÚs 400 ms directement dans l'IDE.
Il est douteux d'utiliser une initialisation retardĂ©e pour tous vos beans dans une application de production. Cette procĂ©dure offre des gains de performances de dĂ©marrage supĂ©rieurs en raison de demandes plus longues pour la premiĂšre fois aux composants individuels du bean. Plus important encore, votre application ne cesse pas de fonctionner rapidement. Mais au lieu de se bloquer immĂ©diatement au dĂ©marrage de l'application, il Ă©chouera uniquement aprĂšs avoir directement demandĂ© le composant mal configurĂ©. Cela peut ĂȘtre trĂšs dangereux car vous ne trouverez pas beaucoup d'erreurs avant qu'il ne soit trop tard. Cependant, l'initialisation retardĂ©e en masse peut ĂȘtre utile pour accĂ©lĂ©rer le temps de dĂ©veloppement, car lorsque vous travaillez avec une certaine fonction, vous ne travaillez gĂ©nĂ©ralement que sur une partie de votre application et n'utilisez pas le reste. Le compromis idĂ©al serait d'activer l'initialisation diffĂ©rĂ©e en masse uniquement pour le dĂ©veloppement local (par exemple, en utilisant un profil de ressort) et de le dĂ©sactiver pour les environnements supĂ©rieurs dĂ©ployĂ©s.
Conclusion
DevTools accĂ©lĂšre et simplifie le dĂ©veloppement d'applications Spring Boot en fournissant un redĂ©marrage automatique et une fonctionnalitĂ© LiveReload. En plus de cela, il dĂ©finit diverses propriĂ©tĂ©s pour des valeurs plus adaptĂ©es au dĂ©veloppement local. De plus, il vous permet de vous connecter Ă distance Ă votre application et en mĂȘme temps d'utiliser la plupart de ses fonctions. Lors du dĂ©marrage de l'application en production, les DevTools ne sont pas utilisĂ©s. Voir la
documentation officielle pour plus de détails.