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 compile
und 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.
ln -s /usr/share/maven/bin/mvnDebug /usr/bin/mvnDebug
and attach a debugger on port 8000
bedeutet das?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.
quelle
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
quelle
Wenn Sie Netbeans verwenden, gibt es eine nette Verknüpfung dazu. Definieren Sie einfach ein Ziel
exec:java
und fügen Sie die Eigenschaft hinzujpda.listen=maven
Getestet auf Netbeans 7.3
quelle
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
quelle
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.
quelle
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.
quelle