在Maven中进行调试?


74

是否可以从Maven启动调试器(如jdb)?我有一个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上)来描述调试的工作方式。我怀疑我必须使用一些插件。

Answers:


35

正如Brian所说,您可以使用远程调试:

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"

然后在eclipse中,可以使用远程调试并将调试器附加到localhost:1044。


113

如果使用的是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使用基于Eclipse的IDE中的更多详细信息。


6
在Mac OS X下,您必须先创建一个指向mvnDebug的链接:ln -s /usr/share/maven/bin/mvnDebug /usr/bin/mvnDebug
Matthias B

1
mvnDebug真的很好!我之前通过mavenOpts做到了,但这很麻烦……
Patrick Cornelissen

这救了我!这是这个有效的解决办法的Eclipse / M2E问题
卢卡斯埃德尔

我无法使其在Windows计算机上运行,​​但是它是一个脚本,可以解决所有环境问题,例如cygwin。最终,我能够调试Jenkins插件。很好的小费。
neves

什么and attach a debugger on port 8000意思
Nisarg Patil'1

24

我以为我会为OSX和Linux人员扩展这些答案(不是他们需要它):

我也喜欢使用mvnDebug。但是,在OSX特立独行者破坏了我的Java开发环境之后,我从头开始,研究这篇文章,并认为我会补充。

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

DOH!安装Maverick时,在新的SSD驱动器和/或所有Java重置之后,我还没有在此框中设置它。

我使用OSX和Linux的软件包管理器,所以我不知道mvn的真正用途。(我知道很短的时间..谢谢brew ..我喜欢我不知道。)

让我们来看看:

$ 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

好。好。很好。一切按计划进行。

现在把那个小b @ stard移到我更容易记住他的地方。

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

该死的,你的电脑...你会服从我的意志。你知道我是谁吗?我是SUDO!弓!

$ 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启用了Java虚拟机工具接口(JVMTI)所使用的JVM中的调试功能。JVMTI是调试器和性能分析工具使用的低级调试接口。借助它,您可以检查状态并控制执行在JVM中运行的应用程序。”

“探查器最常使用的JVMTI子集始终可用。但是,调试器用来逐步执行代码和设置断点的功能会带来一些开销,因此并不总是可用。要启用此功能您必须使用-Xdebug选项。”

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

还要查看-Xrunjdwp上的文档。例如,只有在抛出特定异常时,才可以启用它。您可以将其暂停或运行。反正我离题。



8

如果您使用的是Netbeans,则有一个很好的捷径。只需定义一个目标exec:java并添加属性jpda.listen=maven Netbeans屏幕截图

在Netbeans 7.3上测试


是的,那也是我的答案。如果您不派生exec插件并以“ java”目标作为maven构建的一部分运行,那么您将调试maven构建,包括exec插件。Netbeans本身就是简单性。
99索诺,2016年

这应该标记为答案。帮助我解决了Netbeans中的问题。
Wiz

5

如果您不想依赖于IDE并且想直接在命令行中工作,则可以使用“ jdb”(Java调试器)

正如Samuel所说的那样,进行了一些小的修改(设置suspend = y而不是suspend = n,y表示是,它挂起程序而不运行它,因此您可以设置断点来对其进行调试,如果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远程调试命令行工具


3

为什么不使用JPDA并从单独的调试器进程附加到启动的进程?您应该能够在Maven中指定适当的选项,以在启用调试钩子的情况下启动进程。本文提供了更多信息。


3

我使用MAVEN_OPTS选项,并发现将suspend设置为“ suspend = y”很有用,因为我的exec:java程序通常是小型生成器,在我设法连接调试器之前就已经完成了.... :)它将在继续之前等待调试器附加。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.