Отладка в 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-программы имеют тенденцию быть небольшими генераторами, которые закончены, прежде чем я смогу подключить отладчик....:) С приостановкой на нем будет ждать отладчик, который будет прикрепляться до процедуры.