Développement accéléré avec Spring Boot DevTools

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 @Lazy. 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.

Source: https://habr.com/ru/post/fr479382/


All Articles