Debuggen in Maven?

74

Ist es möglich, einen Debugger wie jdb von Maven aus zu starten? Ich habe eine pom.xml- Datei, die das Projekt erfolgreich kompiliert. Das Programm hängt jedoch irgendwo und ich würde gerne jdb oder einen gleichwertigen Debugger starten, um zu sehen, was passiert.

Ich kompiliere mit mvn compileund starte mit:

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

Ich hatte so etwas erwartet wie:

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

den Debugger zu starten, aber wie immer stimmen meine Erwartungen nicht mit der Philosophie von maven überein.

Außerdem konnte ich keine Dokumentation (auf Mavens Website oder Google) finden, die beschreibt, wie das Debuggen funktioniert. Ich vermute, dass ich ein Plugin verwenden muss.

aduric
quelle

Antworten:

35

Wie Brian sagte, können Sie Remote-Debugging verwenden:

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"

In Ihrer Eclipse können Sie dann das Remote-Debugging verwenden und den Debugger an localhost: 1044 anhängen.

Samuel Yung
quelle
112

Wenn Sie Maven 2.0.8+ verwenden, führen Sie den mvnDebugBefehl anstelle von aus mvnund fügen Sie einen Debugger an Port 8000 hinzu.

Kommentieren Sie für Maven <2.0.8 die folgende Zeile in Ihrer %M2_HOME%/bin/mvn.bat(und speichern Sie möglicherweise die geänderte Version als mvnDebug.bat):

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

Weitere Details in MNG-2105 und Umgang mit Eclipse-basierter IDE .

Pascal Thivent
quelle
6
Unter Mac OS X müssen Sie zuerst einen Link zu mvnDebug erstellen:ln -s /usr/share/maven/bin/mvnDebug /usr/bin/mvnDebug
Matthias B
1
mvnDebug ist wirklich nett! Ich habe das schon mal mit den mavenOpts gemacht, aber das ist umständlich ...
Patrick Cornelissen
Das hat mich gerettet! Es ist eine gültige Problemumgehung für dieses Eclipse / M2E-Problem
Lukas Eder
Ich konnte es auf meinem Windows-Computer nicht zum Laufen bringen, aber es ist ein Skript, das sich um alle Umgebungsprobleme wie Cygwin kümmert. Endlich konnte ich ein Jenkins-Plugin debuggen. Sehr guter Tipp.
Neves
Was and attach a debugger on port 8000bedeutet das?
Nisarg Patil
24

Ich dachte, ich würde diese Antworten für OSX- und Linux-Leute erweitern (nicht, dass sie es brauchen):

Ich bevorzuge auch mvnDebug . Aber nachdem OSX Maverick meine Java-Entwicklungsumgebung zerstört hat, fange ich bei Null an und stoppte diesen Beitrag und dachte, ich würde ihn ergänzen.

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

DOH! Ich habe es nach dem neuen SSD-Laufwerk und / oder dem Zurücksetzen von Java bei der Installation von Maverick nicht auf dieser Box eingerichtet.

Ich benutze einen Paketmanager für OSX und Linux, daher habe ich keine Ahnung, wo mvn wirklich lebt. (Ich weiß es für kurze Zeit. Danke, Gebräu. Ich mag es, dass ich das nicht weiß.)

Mal sehen:

$ which mvn
/usr/local/bin/mvn

Da bist du ... du kleiner b @ stard.

Wo wurden Sie installiert, um:

$ 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! Sie wurden also in /usr/local/Cellar/maven30/3.0.5/bin/mvn installiert. Du freches kleines Bauwerkzeug. Kein Zweifel von Homebrew ...

Hast du deinen kleinen Kumpel mvnDebug dabei?

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

Gut. Gut. Sehr gut. Alles läuft wie geplant.

Bewegen Sie jetzt diesen kleinen b @ stard, wo ich mich leichter an ihn erinnern kann.

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

Verdammt, du Computer ... Du wirst dich meinem Willen unterwerfen. Wissen Sie, wer ich bin? Ich bin SUDO! BOGEN!

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

Jetzt kann ich es von Eclipse aus verwenden ( aber warum sollte ich das tun, wenn ich IntelliJ habe !!!! )

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

Intern verwendet mvnDebug Folgendes:

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

Sie können es also ändern (ich debugge normalerweise an Port 9090).

In diesem Blog wird erklärt, wie Sie das Eclipse-Remote-Debugging einrichten (Schauder).

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

Das Gleiche gilt für Netbeans

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

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

Hier sind einige gute Dokumente zum Befehl -Xdebug im Allgemeinen.

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

"-Xdebug aktiviert Debugging-Funktionen in der JVM, die von der Java Virtual Machine Tools-Schnittstelle (JVMTI) verwendet werden. JVMTI ist eine Debugging-Schnittstelle auf niedriger Ebene, die von Debuggern und Profiling-Tools verwendet wird. Mit ihr können Sie den Status überprüfen und die Ausführung steuern von Anwendungen, die in der JVM ausgeführt werden. "

"Die von Profilern am häufigsten verwendete Teilmenge von JVMTI ist immer verfügbar. Die Funktionalität, die von Debuggern verwendet wird, um den Code zu durchlaufen und Haltepunkte festzulegen, ist jedoch mit einem gewissen Overhead verbunden und nicht immer verfügbar. Um diese Funktionalität zu aktivieren Sie müssen die Option -Xdebug verwenden. "

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

Schauen Sie sich auch die Dokumente auf -Xrunjdwp an. Sie können es nur aktivieren, wenn beispielsweise eine bestimmte Ausnahme ausgelöst wird. Sie können es ausgesetzt oder ausgeführt starten. Wie auch immer ... ich schweife ab.

RickHigh
quelle
19

Ich habe einen einfachen Weg gefunden, dies zu tun -

Geben Sie einfach einen Befehl wie diesen ein -

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

Der 5005-Port wird abgehört. Erstellen Sie jetzt einfach ein Remote-Debugging in Eclipse über Debug-Konfigurationen für localhost (beliebiger Host) und Port 5005.

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

abhihello123
quelle
8

Wenn Sie Netbeans verwenden, gibt es eine nette Verknüpfung dazu. Definieren Sie einfach ein Ziel exec:javaund fügen Sie die Eigenschaft hinzujpda.listen=maven Netbeans-Screenshot

Getestet auf Netbeans 7.3

magarciaschopohl
quelle
Ja, das wäre auch meine Antwort gewesen. Wenn Sie das Exec-Plugin nicht verzweigen und als Teil des Maven-Builds mit dem Ziel "Java" ausführen, debuggen Sie auf diese Weise den Maven-Build, einschließlich des Exec-Plugins. Netbeans ist Einfachheit an sich.
99 Sono
Dies sollte als Antwort markiert werden. Hat mir geholfen, das Problem in Netbeans zu lösen.
Wiz
5

Wenn Sie nicht IDE-abhängig sein und direkt mit der Befehlszeile arbeiten möchten, können Sie 'jdb' (Java Debugger) verwenden.

Wie von Samuel mit kleinen Änderungen erwähnt (set suspend = y anstelle von suspend = n, bedeutet y yes, wodurch das Programm angehalten und nicht ausgeführt wird, sodass Sie Haltepunkte zum Debuggen festlegen können, wenn suspend = n bedeutet, dass das Programm ausgeführt werden kann Abschluss, bevor Sie es überhaupt debuggen können)

Führen Sie in dem Verzeichnis, das Ihre Datei pom.xml enthält, Folgendes aus:

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"

Öffnen Sie dann ein neues Terminal und führen Sie Folgendes aus:

jdb -attach 1044

Sie können dann jdb verwenden, um Ihr Programm zu debuggen! =)

Quellen: Java JDB Remote Debugging-Befehlszeilentool

Chee Loong bald
quelle
3

Warum nicht den JPDA verwenden und über einen separaten Debugger-Prozess eine Verbindung zum gestarteten Prozess herstellen? Sie sollten in der Lage sein, die entsprechenden Optionen in Maven anzugeben, um Ihren Prozess mit aktivierten Debugging-Hooks zu starten. Dieser Artikel enthält weitere Informationen.

Brian Agnew
quelle
3

Ich verwende die Option MAVEN_OPTS und finde es nützlich, suspend auf "suspend = y" zu setzen, da meine exec: java-Programme in der Regel kleine Generatoren sind, die fertig sind, bevor ich einen Debugger anhängen kann .... :) Mit suspend on Es wird warten, bis ein Debugger angehängt ist, bevor es fortfährt.

mürrisch
quelle