Отладка в Maven?

Можно ли запустить отладчик, например jdb, из Maven? У меня есть файл pom.xml, который успешно скомпилирует проект. Однако программа зависает где-то, и мне бы очень хотелось запустить jdb или эквивалентный отладчик, чтобы увидеть, что происходит.

Я компилирую с помощью mvn compile и запускаю с помощью:

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

Я ожидал чего-то вроде:

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

чтобы запустить отладчик, но, как обычно, мои ожидания несовместимы с философией maven.

Кроме того, я не смог найти документацию (на веб-сайте Maven или google), чтобы описать, как работает отладка. Я подозреваю, что мне нужно использовать какой-то плагин.

Ответ 1

Как сказал Брайан, вы можете использовать удаленную отладку:

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"

Затем в вашем затмении вы можете использовать удаленную отладку и присоединить отладчик к localhost: 1044.

Ответ 2

Если вы используете Maven 2.0.8+, запустите команду mvnDebug вместо mvn и присоедините отладчик на порт 8000.

Для Maven < 2.0.8 раскомментируйте следующую строку в %M2_HOME%/bin/mvn.bat (и, возможно, сохраните измененную версию как mvnDebug.bat):

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

Подробнее в MNG-2105 и Работа с IDE на основе Eclipse.

Ответ 3

Я думал, что я бы расширил эти ответы для людей OSX и Linux (не то, что им это нужно):

Я тоже предпочитаю использовать mvnDebug. Но после того, как OSX Maverick уничтожил мою среду разработки Java, я начал с нуля и наткнулся на этот пост, и думал, что добавлю к нему.

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

DOH! Я не установил его на этом поле после нового SSD-диска и/или сброса всего Java, когда я установил Maverick.

Я использую менеджер пакетов для OSX и Linux, поэтому понятия не имею, где на самом деле живет mvn. (Я знаю в течение коротких периодов времени.. спасибо, варево. Мне нравится, что я не знаю этого.)

Давай посмотрим:

$ which mvn
/usr/local/bin/mvn

Вот ты где... маленький b @stard.

Теперь, где вы установили:

$ 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

Ага! Итак, вы установили в /usr/local/Cellar/maven30/3.0.5/bin/mvn. Ты нахальный маленький инструмент для сборки. Без сомнения, доморощенный...

У вас есть ваш маленький приятель mvnDebug с вами?

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

Хорошо. Хорошо. Отлично. Все идет по плану.

Теперь перемести этот маленький б @стард туда, где я смогу его легче запомнить.

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

Черт возьми, компьютер... Ты подчинишься моей воле. Ты знаешь кто я? Я СУДО! ЛУК!

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

Теперь я могу использовать его из Eclipse (но зачем мне это делать, если у меня есть IntelliJ !!!!)

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

Внутренне mvnDebug использует это:

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

Так что вы можете изменить его (я обычно отлаживаю на порт 9090).

В этом блоге объясняется, как настроить удаленную отладку Eclipse (содрогание)

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

То же самое Netbeans

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

То же самое IntelliJ http://www.jetbrains.com/idea/webhelp/run-debug-configuration-remote.html

Вот несколько хороших документов по команде -Xdebug в целом.

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

"-Xdebug обеспечивает возможности отладки в JVM, которые используются интерфейсом инструментов виртуальной машины Java (JVMTI). JVMTI - это низкоуровневый интерфейс отладки, используемый отладчиками и инструментами профилирования. С его помощью вы можете проверять состояние и контролировать выполнение приложений, работающих в JVM. "

"Подмножество JVMTI, которое чаще всего используется профилировщиками, всегда доступно. Однако функциональность, используемая отладчиками для возможности пошагового выполнения кода и установки точек останова, связана с некоторыми издержками и не всегда доступна. Чтобы включить эту функцию Вы должны использовать опцию -Xdebug. "

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

Проверьте документы на -Xrunjdwp тоже. Вы можете включить его только тогда, когда, например, выдается определенное исключение. Вы можете запустить его приостановлено или работает. Во всяком случае.. Я отвлекся.

Ответ 4

Я нашел простой способ сделать это -

Просто введите команду вроде этого -

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

Он начнет прослушивать порт 5005. Теперь просто создайте удаленную отладку в Eclipse через Debug Configurations для localhost (любой хост) и порт 5005.

Источник - https://doc.nuxeo.com/display/CORG/How+to+Debug+a+Test+Run+with+Maven

Ответ 5

Если вы используете Netbeans, есть хороший ярлык для этого. Просто определите цель exec:java и добавьте свойство jpda.listen=maven Netbeans screenshot

Протестировано на Netbeans 7.3

Ответ 6

Если вы не хотите быть зависимым от IDE и хотите работать непосредственно с командной строкой, вы можете использовать 'jdb' (Java Debugger)

Как упоминалось Самуэлем с небольшой модификацией (set suspend = y вместо suspend = n, y означает yes, который приостанавливает программу и не запускает ее, чтобы вы могли установить контрольные точки для ее отладки, если suspend = n означает, что она может запускаться программа до завершения, прежде чем вы сможете даже отладить ее)

В каталоге, который содержит ваш pom.xml, выполните:

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"

Затем откройте новый терминал и выполните:

jdb -attach 1044

Затем вы можете использовать jdb для отладки вашей программы! =)

Источники: Инструмент командной строки удаленной отладки Java jdb

Ответ 7

Почему бы не использовать JPDA и подключиться к запущенному процессу из отдельного процесса отладчика? Вы должны иметь возможность указать соответствующие параметры в Maven для запуска вашего процесса с включенными крючками отладки. В этой статье есть дополнительная информация.

Ответ 8

Я использую параметр MAVEN_OPTS и считаю полезным установить suspend на "suspend = y" как мой exec: java-программы имеют тенденцию быть небольшими генераторами, которые закончены, прежде чем я смогу подключить отладчик....:) С приостановкой на нем будет ждать отладчик, который будет прикрепляться до процедуры.