Le débogage dans Maven?

Est-il possible de lancer un débogueur tel que jdb de Maven? J’ai un fichier pom.xml qui comstack le projet avec succès. Cependant, le programme se bloque quelque part et j’aimerais vraiment lancer jdb ou un débogueur équivalent pour voir ce qui se passe.

Je comstack en utilisant mvn comstack et lance en utilisant:

 mvn exec:java -Dexec.mainClass="com.mycompany.app.App" 

Je m’attendais à quelque chose comme:

 mvn exec:jdb -Dexec.mainClass="com.mycompany.app.App" 

pour lancer le débogueur mais, comme d’habitude, mes attentes sont incompatibles avec la philosophie de maven.

De plus, je n’ai trouvé aucune documentation (sur le site Web de Maven ou sur Google) pour décrire le fonctionnement du débogage. Je pense que je dois utiliser un plugin.

Comme l’a dit Brian, vous pouvez utiliser le débogage à distance:

 mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 com.mycompany.app.App" 

Ensuite, dans votre éclipse, vous pouvez utiliser le débogage à distance et attacher le débogueur à localhost: 1044.

Si vous utilisez Maven 2.0.8+, exécutez la commande mvnDebug à la place de mvn et joignez un débogueur sur le port 8000.

Pour Maven <2.0.8, supprimez la mise en commentaire de la ligne suivante dans votre %M2_HOME%/bin/mvn.bat (et peut-être enregistrez la version modifiée en tant que mvnDebug.bat ):

 @REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.comstackr=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 

Plus de détails dans MNG-2105 et Gestion des IDE basés sur Eclipse .

J’ai pensé développer ces réponses pour les utilisateurs d’OSX et de Linux (pas qu’ils en aient besoin):

Je préfère utiliser mvnDebug aussi. Mais après que OSX Maverick ait détruit mon environnement de développement Java, je pars de zéro et écrase sur cet article, et pensais que je voudrais y append.

 $ mvnDebug vertx:runMod -bash: mvnDebug: command not found 

DOH! Je ne l’ai pas configuré sur cette boîte après le nouveau disque SSD et / ou la réinitialisation de tout Java lorsque j’ai installé Maverick.

J’utilise un gestionnaire de paquets pour OSX et Linux, donc je ne sais pas où vit réellement mvn. (Je sais pour de brèves périodes de temps .. merci brew .. J’aime que je ne le sache pas.)

Voyons voir:

 $ which mvn /usr/local/bin/mvn 

Vous voilà … petit b @ stard.

Maintenant, où avez-vous été installé pour:

 $ ls -l /usr/local/bin/mvn lrwxr-xr-x 1 root wheel 39 Oct 31 13:00 / /usr/local/bin/mvn -> /usr/local/Cellar/maven30/3.0.5/bin/mvn 

Aha! Donc, vous êtes installé dans /usr/local/Cellar/maven30/3.0.5/bin/mvn. Votre petit outil de construction effronté. Sans doute par homebrew …

Avez-vous votre petit ami mvnDebug avec vous?

 $ ls /usr/local/Cellar/maven30/3.0.5/bin/mvnDebug /usr/local/Cellar/maven30/3.0.5/bin/mvnDebug 

Bien. Bien. Très bien. Tout se passe comme prévu.

Maintenant déplacez ce petit b @ stard où je peux me souvenir de lui plus facilement.

 $ ln -s /usr/local/Cellar/maven30/3.0.5/bin/mvnDebug /usr/local/bin/mvnDebug ln: /usr/local/bin/mvnDebug: Permission denied 

Darn you computer … Tu vas te soumettre à ma volonté. Est-ce que tu sais qui je suis? Je suis SUDO! ARC!

 $ sudo ln -s /usr/local/Cellar/maven30/3.0.5/bin/mvnDebug /usr/local/bin/mvnDebug Password: 

Maintenant je peux l’utiliser depuis Eclipse (mais pourquoi le ferais-je quand j’ai IntelliJ !!!!)

 $ mvnDebug vertx:runMod Preparing to Execute Maven in Debug Mode Listening for transport dt_socket at address: 8000 

En interne, mvnDebug utilise ceci:

 MAVEN_DEBUG_OPTS="-Xdebug -Xnoagent -Djava.comstackr=NONE \ -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000" 

Vous pouvez donc le modifier (je débogue généralement sur le port 9090).

Ce blog explique comment configurer le débogage à distance Eclipse (frémissement)

http://javarevisited.blogspot.com/2011/02/how-to-setup-remote-debugging-in.html

Idem Netbeans

https://blogs.oracle.com/atishay/entry/use_netbeans_to_debug_a

Idem IntelliJ http://www.jetbrains.com/idea/webhelp/run-debug-configuration-remote.html

Voici quelques bons documents sur la commande -Xdebug en général.

http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

“-Xdebug active les fonctionnalités de débogage dans la JVM utilisées par JVMTI (Java Virtual Machine Tools Interface). JVMTI est une interface de débogage de bas niveau utilisée par les débogueurs et les outils de profilage. Grâce à elle, vous pouvez inspecter l’état et contrôler l’exécution des applications en cours d’exécution dans la JVM. ”

“Le sous-ensemble de JVMTI le plus utilisé par les profileurs est toujours disponible. Cependant, la fonctionnalité utilisée par les débogueurs pour pouvoir parcourir le code et définir des points d’arrêt est associée à des fonctionnalités et n’est pas toujours disponible. Pour activer cette fonctionnalité vous devez utiliser l’option -Xdebug. ”

-Xrunjdwp: transport = dt_socket, server = y, suspend = n myApp

Découvrez les documents sur -Xrunjdwp aussi. Vous ne pouvez l’activer que lorsqu’une certaine exception est lancée, par exemple. Vous pouvez le démarrer suspendu ou en cours d’exécution. En tout cas .. je m’égare.

J’ai trouvé un moyen facile de le faire –

Entrez simplement une commande comme celle-ci –

 >mvn -Dtest=TestClassName#methodname -Dmaven.surefire.debug test 

Il va commencer à écouter le port 5005. Maintenant, créez simplement un débogage distant dans Eclipse via les configurations de débogage pour localhost (n’importe quel hôte) et le port 5005.

Source – https://doc.nuxeo.com/display/CORG/How+to+Debug+a+Test+Run+with+Maven

Si vous utilisez Netbeans, il existe un bon raccourci pour cela. Il suffit de définir un objective exec:java et d’append la propriété jpda.listen=maven Netbeans capture d'écran

Testé sur Netbeans 7.3

Pourquoi ne pas utiliser le JPDA et attacher au processus lancé à partir d’un processus de débogage séparé? Vous devriez pouvoir spécifier les options appropriées dans Maven pour lancer votre processus avec les hooks de débogage activés. Cet article contient plus d’informations.

J’utilise l’option MAVEN_OPTS, et je trouve utile de définir suspend pour “suspend = y” comme exécutable: les programmes Java ont tendance à être de petits générateurs terminés avant que j’aie réussi à connecter un débogueur …. 🙂 il faudra attendre qu’un débogueur soit connecté avant de procéder.

Si vous ne voulez pas être dépendant de l’IDE et que vous voulez travailler directement avec la ligne de commande, vous pouvez utiliser “jdb” (Java Debugger)

Comme mentionné par Samuel avec de légères modifications (set suspend = y au lieu de suspend = n, y signifie yes qui suspend le programme et ne pas l’exécuter de sorte que vous puissiez définir des points d’arrêt pour le déboguer, si suspend = n signifie qu’il peut exécuter le programme achèvement avant même de pouvoir le déboguer)

Sur le répertoire qui contient votre pom.xml, exécutez:

 mvn exec:exec -Dexec.executable="java" -Dexec.args="-classpath %classpath -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044 com.mycompany.app.App" 

Ensuite, ouvrez un nouveau terminal et exécutez:

 jdb -attach 1044 

Vous pouvez ensuite utiliser jdb pour déboguer votre programme! =)

Sources: Outil de ligne de commande de débogage distant Java jdb