81 votes

Comment déboguer une application spring-boot avec IntelliJ IDEA community Edition ?

J'ai des difficultés à déboguer une application Java spring-boot sur IntelliJ IDEA community Edition. Le problème principal est que l'IDE ne s'arrête pas sur un point d'arrêt, même si le programme s'exécute à travers lui. Comment puis-je faire en sorte qu'IntelliJ IDEA s'arrête sur le point d'arrêt ?

A titre d'information complémentaire, voici mes configurations d'exécution :

Configuration Maven avec une commande comme : spring-boot:run. Avant le lancement, je construis le projet.

1 votes

L'avez-vous exécuté en mode débogage ?

1 votes

Oui, je l'ai fait.....

1 votes

Voici un plugin maven pour Spring Boot docs.spring.io/spring-boot/docs/current/maven-plugin/examples/ L'avez-vous essayé ?

110voto

Abdullah Gürsu Points 557

Tldr : Vous pouvez essayer de modifier la ligne de commande comme suit :

spring-boot:run -Dspring-boot.run.fork=false

Explication :

Lors de l'exécution de l'application en mode débogage, le débogueur IntelliJ s'attache au processus Java qu'il démarre lui-même (en ajoutant les paramètres appropriés, -agentlib:jdwp etc., sur la ligne de commande Java).

Très souvent, ces processus Java peuvent alors créer une nouvelle instance, qui est pas obtient les mêmes paramètres et, parce qu'il se trouve dans un processus distinct, il n'est pas connecté au débogueur. Cela peut prêter à confusion.

En spring-boot:run L'objectif de Maven, en plus de créer une nouvelle JVM, crée encore plus de confusion, car il crée parfois une fourche et parfois non, en fonction des options qu'il reçoit, entre autres choses. Une partie de ces informations peut être trouvée dans la page la documentation mais ce n'est pas toujours évident.

Vous devez d'abord vérifier si le processus Java est réellement débogué. Lorsque vous démarrez l'application à partir d'IntelliJ, vous verrez des messages défiler dans l'onglet Run / Debug. En haut, il y a la ligne de commande qui est exécutée. Elle doit contenir les paramètres du débogueur ( -agentlib:jdwp etc) et il devrait être suivi d'un message disant "Connected to the target VM", ce qui est le débogueur confirmant qu'il est en contact.

Ensuite, si vous n'êtes pas sûr que la JVM a été forkée, vous pouvez vérifier la liste des processus de votre système d'exploitation, par exemple sous MacOS et *nix, vous pouvez utiliser la commande suivante ps aux | grep java . Les processus Java ont généralement une liste de paramètres gigantesque, dont la plus grande partie est le chemin d'accès à la classe. L'application en cours d'exécution se trouve à la toute fin de la ligne de commande. Si la JVM a été forkée, vous avez le processus qui exécute l'objectif Maven, et un autre qui exécute l'application Spring. Votre débogueur sera alors connecté au processus que vous êtes en train d'exécuter. pas et vos points d'arrêt ne fonctionneront pas.

Pour arrêter spring-boot:run de forkage, vous pouvez utiliser l'option fork ci-dessus.

1 votes

Ceci a résolu le problème pour moi. J'ai essayé l'option JAVA_OPTS y el Drun.jvmArguments sans succès.

1 votes

C'est la solution parfaite, elle a fonctionné pour moi. l'explication est très claire.

0 votes

Cela m'a sauvé la mise !

74voto

stinger Points 1309

La seule approche qui a fonctionné pour moi est d'exécuter ou de déboguer l'application directement à partir d'Intellij Idea. Il suffit d'ouvrir la classe qui contient

 public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }

Et cliquez sur le bouton droit de la souris->Déboguer mon application

1 votes

Il serait intéressant de jeter un coup d'œil à la console d'IntelliJ et de voir ce qu'elle fait réellement et pourquoi cela serait différent des autres façons de démarrer l'application avec un débogueur attaché.

0 votes

Idea ajoute sa propre configuration de débogage à la JVM et lance le débogage sur un port arbitraire plutôt que d'utiliser les propriétés de débogage que vous avez prédéfinies.

0 votes

Ne fonctionne pas dans mon cas, intellij ne s'arrête toujours pas aux points d'arrêt

56voto

piphonom Points 315

Pour moi, ces étapes fonctionnent :

  1. Sélectionnez le menu Exécuter -> Modifier les configurations...
  2. Créer une nouvelle télécommande Configuration. Par défaut, vous n'avez pas besoin de modifier les paramètres :
    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 . Mais si vous voulez par exemple suspendre la JVM avant de vous connecter, vous pouvez pouvez changer suspend=y . Vous pouvez également changer de port, etc.
  3. Copiez la ligne de commande en fonction de votre version de JVM et sauvegardez la configuration.
  4. Dans une fenêtre de Terminal, lancez votre application avec (dans le cas de l'utilisation de Maven et de la JVM 1.5 et plus) mvn clean spring-boot:run -Dspring-boot.run.jvmArguments="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
  5. Connectez-vous à votre application en exécutant la configuration à distance créée précédemment à l'étape 2. Vous pouvez maintenant déboguer votre application.

5 votes

Au cas où quelqu'un utiliserait le copier-coller : -Drun:jvmArguments= devrait être -Drun.jvmArguments= (point au lieu de deux points)

1 votes

J'ai en fait eu besoin d'ajouter ceci au fichier pom.xml, car spring-boot ignorait l'argument -Drun... : <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.0.3.RELEASE</version> <configuration> <jvmArguments>-agentlib:jdwp=transport=dt_socket,server=y,su‌​spend=n,address=5005‌​</jvmArguments> </configuration> </plugin>

0 votes

Dans Intellij, vous pouvez également aller dans Runner dans votre configuration d'exécution et collez ces arguments ( -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,addre‌​ss=5005 ) en VM Options l'entrée.

14voto

Burton Points 36

J'ai constaté que l'inclusion de Spring Dev Tools dans mon build provoquait l'interruption du débogage IntelliJ (selon votre description ci-dessus). Si vous n'utilisez pas cette fonctionnalité, il vous suffit de la supprimer de votre build.

Si vous utilisez Maven, les lignes ci-dessous doivent être supprimées de votre pom.xml.

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

0 votes

Ce fait d'importation n'est pas reflété dans la documentation de spring-devtools. docs.spring.io/spring-boot/docs/current/reference/html/ . Nous vous remercions.

5voto

kite Points 41

La réponse de piphonom est bonne, mais il faut faire un peu plus, c'est à dire ajouter les jvmArguments au plugin maven comme ceci

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <jvmArguments>
            -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
        </jvmArguments>
    </configuration>
</plugin>

Pour plus d'informations sur le débogage à distance pour le projet Spring Boot, lire cette

0 votes

Cela n'a pas été utile. Peut-être que le port de débogage est aléatoire et qu'il n'est pas lié à la configuration du plugin maven.

0 votes

Cela a très bien fonctionné pour moi. La suspension=y a fait en sorte que la compilation attende que le débogueur s'attache, ce qui est parfait pour déboguer les problèmes liés à l'initialisation. openjdk 15 2020-09-15 OpenJDK Runtime Environment (build 15+36-1562) OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing) Apache Maven 3.6.3 IntelliJ 2020.3.2 Spring Boot 2.4.2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X