Améliorer sa boucle de développement avec Spring-Boot-DevTools

L’écosystème Spring est très vaste et est beaucoup utilisé pour la construction de différents types d’applications JAVA, et principalement des backends. Il ne cesse de nous rendre la vie plus facile avec sa capacité de configuration automatique, mais offre aussi des outils de développement qui améliorent l'expérience du développeur.

Comment ça ? Y a-t-il vraiment des outils pour simplifier la vie des développeurs ?

Et oui ! D’ailleurs, dans ces articles, j’aborderai divers outils, fournis par Spring Boot, que nous ne pensons pas nécessairement à ajouter à nos projets. Pourtant, ils pourraient nous donner les moyens d’aller plus vite en termes de configuration, de débogage et de développement.

Et pour commencer en beauté nous allons parler d’un module conçu pour améliorer  l’expérience de développement : DevTools. Grâce à lui, la modification du code est prise en compte à chaud ! Plus besoin de relancer le serveur au moindre ajout de ligne.

Mise en place de DevTools

Pour installer DevTools il vous suffit d’ajouter la dépendance à votre projet SpringBoot. Par exemple avec Maven, vous ajouterez :

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>

 

Ensuite, il vous faudra configurer votre IDE pour prendre en compte DevTools. Pour IntelliJ, il faut : 

  1. Aller dans File.../Settings... -> Build, Execution, Deployment -> Compiler et cocher Build project automatically.

 

  1. Il faut changer la config de Registry. Appuyer 3 fois sur Shift, ou fait Ctrl+Shift+A , puis chercher Registry

Dans Registry, cherchez compiler.automake.allow.when.app.running et cochez la case

 

Enfin, le module spring-boot-devtools comprend un serveur LiveReload intégré qui est utilisé pour déclencher une actualisation du navigateur lorsqu'une ressource est modifiée. Pour que cela se produise dans le navigateur, nous devons installer le plugin LiveReload. On prendra par exemple Remote Live Reload pour Chrome

 

Intérêts et limites

Le mécanisme repose sur l’utilisation de 2 classloaders : 

  • - Les classes contenues dans les librairies sont placées dans un premier classloader ; 
  • - Les classes que vous êtes susceptible de changer (celles dans votre IDE) sont elles chargées dans un second classloader.

Par défaut, toutes les modifications (créer, mettre à jour ou supprimer) que vous avez apportées à des fichiers dans le chemin de classe du projet (généralement des fichiers du répertoire src/main ) déclencheront Spring DevTools, provoquant le redémarrage de l’application à chaud. Aussi, seul ce second classloader est alors pris en compte. Il est supprimé et recréé.  Ce mode de fonctionnement permet d’avoir des temps de démarrage plus rapides qu’un redémarrage complet, mais, en contrepartie, il pourra être plus coûteux en RAM.

Attention néanmoins, par défaut, les modifications apportées aux dossiers resources /META-INF/maven , /META-INF/resources , /resources , /static , /public et /templates , ainsi qu’au fichier POM ne déclencheront pas de redémarrage automatique. De même, un crash nécessitera de la relancer (logique).  

Enfin, en mode développement, DevTools est également capable de désactiver certaines propriétés de cache susceptibles d’être utilisées par des librairies Spring, notamment celles des moteurs de template. Par exemple, la configuration par défaut de Thymeleaf avec Spring Boot active la mise en cache automatiquement des pages. Or, si spring-boot-devtools est présent, le cache se verra désactivé.

Conclusion

Spring Boot DevTools n’est pas le seul outil sur ce segment. On pourra ainsi citer JRebel ou  DCEVM, qui permettent également d'ignorer les recompilations et les redéploiements pendant le développement Java. Néanmoins, les principaux intérêts de DevTools restent sa parfaite intégration à l’écosystème Spring Boot, l’absence de plugins additionnels pour les IDE, et sa gratuité.

Pour conclure, dans ce didacticiel, nous avons découvert un outil convivial pour les développeurs fourni par Spring Boot, permettant de rendre l’expérience de développement plus agréable et de diminuer les temps morts à cause d’un redémarrage de l’application.

 
Frank Serra

Consultant Versusmind