在Maven中debugging?

是否有可能从Maven启动一个像jdb这样的debugging器? 我有一个pom.xml文件,成功编译项目。 然而,程序挂在某处,我真的想启动jdb或等价的debugging器,看看发生了什么。

我编译使用mvn compile和启动使用:

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

我期待的是:

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

启动debugging器,但像往常一样,我的期望与maven的哲学是不一致的。

另外,我找不到任何文档(在Maven的网站或谷歌)来描述如何debugging工作。 我怀疑我必须使用一些插件。

就像Brian所说的,你可以使用远程debugging:

 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中,你可以使用远程debugging,并将debugging器附加到localhost:1044。

如果您使用的是Maven 2.0.8+,请运行mvnDebug命令代替mvn并在端口8000上附加一个debugging器。

对于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 。

我想我会扩大对OSX和Linux的人(不是他们需要它)的这些答案:

我也喜欢使用mvnDebug 。 但是,在OSX特立独行的人销毁了我的Java开发环境之后,我从头开始写这篇文章,并且认为我会join它。

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

DOH! 当我安装Maverick时,在新的SSD驱动器和/或所有Java的重置之后,我还没有在这个盒子上设置它。

我使用OSX和Linux的包pipe理器,所以我不知道mvn真的在哪里生活。 (我知道短暂的时间..谢谢brew ..我喜欢,我不知道这一点。)

让我们来看看:

 $ which mvn /usr/local/bin/mvn 

在那里你是……你小@

现在你从哪里安装到:

 $ 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 Password: 

现在我可以从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" 

所以你可以修改它(我通常debugging端口9090)。

本博客解释了如何设置Eclipse远程debugging(不寒而栗)

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中的debuggingfunction,JVMTI是debugging器和分析工具使用的低级debugging接口,可以检查状态并控制执行在JVM中运行的应用程序“。

“分析器最常用的JVMTI的子集总是可用的,但是debugging器能够遍历代码和设置断点的function有一些相关的开销,并不总是可用的。你必须使用-Xdebug选项。“

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

请查看-Xrunjdwp上的文档。 例如,只有在引发某个exception时才能启用它。 你可以启动它暂停或运行。 无论如何..我离题了。

我发现了一个简单的方法来做到这一点 –

只需input一个像这样的命令 –

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

它将开始收听5005端口。 现在只需通过本地主机(任何主机)和端口5005的Debug Configurations在Eclipse中创build一个远程debugging。

来源 – https://doc.nuxeo.com/display/CORG/How+to+Debug+a+Test+Run+with+Maven

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

testingNetbeans 7.3

为什么不使用JPDA并从独立的debugging器进程连接到启动的进程? 您应该能够在Maven中指定相应的选项,以启用启用了debugging挂钩的进程。 这篇文章有更多的信息。

我使用MAVEN_OPTS选项,并发现它是有用的悬挂设置为“suspend = y”作为我的exec:java程序往往是小型发电机,我已经设法附加debugging器之前完成…. :)随着暂停它将等待debugging器附加,然后再继续。

如果你不想成为依赖IDE的,并想直接使用命令行,你可以使用'jdb'(Java Debugger)

正如Samuel所提到的那样,通过小的修改(设置suspend = y而不是suspend = n,y意味着是挂起程序并且不运行,所以你可以设置断点来debugging它,如果suspend = n意味着它可以运行程序完成之前,你甚至可以debugging它)

在包含您的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" 

然后,打开一个新的terminal并执行:

 jdb -attach 1044 

然后你可以使用jdb来debugging你的程序!=)

来源: Java jdb远程debugging命令行工具