Débogage des applications Spring

Débogage des applications Spring

1. introduction

Le débogage est l'un des outils les plus importants pour l'écriture de logiciels.

Dans ce didacticiel, nous allons passer en revue certaines des façons dont nous pouvons déboguer les applications Spring.

Nous verrons également comment Spring Boot, les serveurs d'applications traditionnels et les IDE simplifient cela.

2. Arguments de débogage Java

Voyons tout d'abord ce que Java nous offre.

By default, the JVM does not enable debugging. En effet, le débogage crée une surcharge supplémentaire au sein de la machine virtuelle Java. Cela peut également poser un problème de sécurité pour les applications accessibles au public.

Par conséquent,debugging should only be performed during development et jamais sur les systèmes de production.

Avant de pouvoir attacher un débogueur, nous devons d’abord configurer la JVM pour permettre le débogage. Nous faisons cela en définissant un argument de ligne de commande pour la machine virtuelle Java:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Décrivons ce que chacune de ces valeurs signifie:

-agentlib: jdwp

Activez l'agent JDWP (Java Debug Wire Protocol) dans la machine virtuelle Java. This is the main command line argument that enables debugging.

transport = dt_socket

Utilisez une prise réseau pour les connexions de débogage. Les autres options incluent les sockets Unix et la mémoire partagée.

serveur = y

Écoutez les connexions entrantes du débogueur. Lorsqu'il est défini surn, le processus essaiera de se connecter à un débogueur au lieu d'attendre les connexions entrantes. Des arguments supplémentaires sont requis lorsque ce paramètre est défini surn.

suspendre = n

N'attendez pas une connexion de débogage au démarrage. L'application démarrera et fonctionnera normalement jusqu'à ce qu'un débogueur soit attaché. Lorsqu'il est défini sury, le processus ne démarre pas tant qu'un débogueur n'est pas connecté.

adresse = 8000

Port réseau sur lequel la JVM écoutera les connexions de débogage.

Les valeurs ci-dessus sont standard et fonctionneront pour la plupart des cas d'utilisation et des systèmes d'exploitation. LeJPDA connection guide couvre toutes les valeurs possibles plus en détail.

3. Applications Spring Boot

Applications Spring Bootcan be started several ways. Le moyen le plus simple consiste à utiliser la ligne de commande en utilisant la commandejava avec l'option-jar.

Pour activer le débogage, nous ajouterions simplement l'argument de débogage en utilisant l'option-D:

java -jar myapp.jar -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Avec Maven, nous pouvons utiliser l'objectifrun fourni pour démarrer notre application avec le débogage activé:

mvn spring-boot:run -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

De même, avec Gradle, nous pouvons utiliser la tâchebootRun. Tout d'abord, nous devons mettre à jour le fichierbuild.gradle pour nous assurer que Gradle transmet les arguments de ligne de commande à la JVM:

bootRun {
   systemProperties = System.properties
}

Nous pouvons maintenant exécuter la tâchebootRun:

gradle bootRun -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

4. Serveurs d'application

Alors que Spring Boot est devenu très populaire ces dernières années, lesapplication serverstraditionnels sont encore assez répandus dans les architectures logicielles modernes. Dans cette section, nous verrons comment activer le débogage pour certains des serveurs d'applications les plus populaires.

La plupart des serveurs d'applications fournissent un script pour démarrer et arrêter des applications. L'activation du débogage consiste généralement simplement à ajouter des arguments supplémentaires à ce script et / ou à définir des variables d'environnement supplémentaires.

4.1. Matou

Le script de démarrage pourTomcat est nommécatalina.sh (catalina.bat sous Windows). Pour démarrer un serveur Tomcat avec le débogage activé, nous pouvons ajouterjpda aux arguments:

catalina.sh jpda start

Les arguments de débogage par défaut utiliseront une socket réseau écoutant sur le port 8000 avecsuspend=n. Celles-ci peuvent être modifiées en définissant une ou plusieurs des variables d'environnement suivantes:JPDA_TRANSPORT,JPDA_ADDRESS etJPDA_SUSPEND.

Nous pouvons également obtenir un contrôle total des arguments de débogage en définissantJPDA_OPTS. Lorsque cette variable est définie, elle prévaut sur les autres variables JPDA. Il doit donc s'agir d'un argument de débogage complet pour la machine virtuelle Java.

4.2. Mouche sauvage

Le script de démarrage pourWildfly eststand-alone.sh. Pour démarrer un serveur Wildfly avec le débogage activé, nous pouvons ajouter–debug.

Le mode de débogage par défaut utilise un écouteur de réseau sur le port 8787 avecsuspend=n. Nous pouvons remplacer le port en le spécifiant après l'argument–debug.

Pour plus de contrôle sur l'argument de débogage, nous pouvons simplement ajouter les arguments de débogage complets à la variable d'environnementJAVA_OPTS.

4.3. Weblogic

Le script de démarrage de Weblogic eststartWeblogic.sh. Pour démarrer un serveur Weblogic avec le débogage activé, nous pouvons définir la variable d'environnementdebugFlag surtrue.

Le mode de débogage par défaut utilise un écouteur de réseau sur le port 8453 avecsuspend=n. Nous pouvons remplacer le port en définissant la variable d'environnementDEBUG_PORT.

Pour plus de contrôle sur l'argument de débogage, nous pouvons simplement ajouter les arguments de débogage complets à la variable d'environnementJAVA_OPTIONS.

Les dernières versions de Weblogic fournissent également un plugin Maven pour démarrer et arrêter les serveurs. This plugin will honor the same environment variables as the startup script.

4.4. Glassfish

Le script de démarrage de Glassfish estasadmin. Pour démarrer un serveur Glassfish avec le débogage activé, nous devons utiliser–debug:

asadmin start-domain --debug

Le mode de débogage par défaut utilise un écouteur de réseau sur le port 9009 avecsuspend=n.

4.5. Jetée

Le serveur d'applications Jetty ne vient pas avec un script de démarrage. Au lieu de cela, les serveurs Jetty sont démarrés à l'aide de la commandejava.

Par conséquent, l'activation du débogage est aussi simple que d'ajouter les arguments de ligne de commande JVM standard.

5. Débogage depuis un IDE

Maintenant que nous avons vu comment activer le débogage dans différents types d'applications, examinons la connexion d'un débogueur.

Chaque IDE moderne offre un support de débogage. Cela inclut à la fois la possibilité de démarrer un nouveau processus avec le débogage activé, ainsi que la possibilité de déboguer un processus déjà en cours d'exécution.

5.1. IntelliJ

IntelliJ offre un support de premier ordre pour les applications Spring et Spring Boot. Le débogage est aussi simple que de naviguer vers la classe avec la méthodemain, de cliquer avec le bouton droit sur l'icône en forme de triangle et de choisir Déboguer.

image

Si un projet contient plusieurs applications Spring Boot, IntelliJ fournira une fenêtre d’outil Exécuter le tableau de bord. Cette fenêtre nous permet de déboguer plusieurs applications Spring Boot à partir d’un seul endroit:

image

Pour les applications utilisant Tomcat ou d'autres serveurs Web, nous pouvons créer une configuration personnalisée pour le débogage. SousRun>Edit Configurations, il existe un certain nombre de modèles pour les serveurs d'applications les plus courants:

image

Enfin, IntelliJ facilite la connexion à tout processus en cours et le débogage. As long as the application was started with the proper debug arguments, IntelliJ peut s'y connecter, même s'il se trouve sur un autre hôte.

Sur l'écranRun/Debug Configurations, le modèleRemote nous permettra de configurer comment nous attacher à l'application déjà en cours d'exécution:

image

Notez qu'IntelliJ doit uniquement connaître le nom d'hôte et le port de débogage. Pour plus de commodité, il nous indique les arguments de ligne de commande JVM appropriés qui doivent être utilisés sur l’application à déboguer.

5.2. Éclipse

Le moyen le plus rapide de déboguer une application Spring Boot dans Eclipse est de cliquer avec le bouton droit sur la méthode principale à partir des fenêtresPackage Explorer ouOutline:

image

L'installation par défaut d'Eclipse ne prend pas en charge Spring ou Spring Boot prêt à l'emploi. Cependant, il existe unSpring Tools add-on disponible sur Eclipse Marketplace qui fournit un support Spring comparable à IntelliJ.

Plus particulièrementthe add-on provides a Boot Dashboard that lets us manage multiple Spring Boot applications from a single place:

image

L'add-on fournit également une configuration d'exécution / débogageSpring Boot qui permet de personnaliser le débogage d'une seule application Spring Boot. Cette vue personnalisée est disponible aux mêmes endroits que la configuration standard deJava Application.

Pour déboguer un processus déjà en cours d'exécution, soit localement, soit sur un hôte distant, nous pouvons utiliser la configuration deRemote Java Application:

image

6. Débogage avec Docker

Le débogage d'unSpring application inside a Docker container peut nécessiter une configuration supplémentaire. If the container is running locally and is not using host network mode, alors le port de débogage ne sera pas accessible en dehors du conteneur.

Il existe plusieurs façons d’exposer le port de débogage dans Docker.

Nous pouvons utiliser–expose avec la commandedocker run:

docker run --expose 8000 mydockerimage

Nous pouvons également ajouter la directiveEXPOSE auxDockerfile:

EXPOSE 8000

Ou si nous utilisons Docker Compose, nous pouvons l'ajouter dans le YAML:

expose:
 - "8000"

7. Conclusion

Dans cet article, nous avons vu comment activer le débogage pour n'importe quelle application Java.

En ajoutant simplement un seul argument de ligne de commande, nous pouvons facilement déboguer toute application Java.

Nous avons également constaté que Maven et Gradle, ainsi que la plupart des IDE populaires, disposent tous de modules complémentaires spécialisés pour faciliter le débogage des applications Spring et Spring Boot.