在Maven中调试?

adu*_*ric 62 java debugging maven-2

是否可以从Maven启动调试器,如jdb?我有一个pom.xml文件,可以成功编译项目.但是,程序挂起了某个地方,我真的想启动jdb或等效的调试器来查看发生了什么.

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

mvn exec:java -Dexec.mainClass="com.mycompany.app.App"
Run Code Online (Sandbox Code Playgroud)

我期待的是:

mvn exec:jdb -Dexec.mainClass="com.mycompany.app.App"
Run Code Online (Sandbox Code Playgroud)

启动调试器,但像往常一样,我的期望与maven的理念不一致.

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

Pas*_*ent 102

如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

更多细节在MNG-2105处理基于Eclipse的IDE.

  • 在Mac OS X下你必须首先创建一个到mvnDebug的链接:`ln -s/usr/share/maven/bin/mvnDebug/usr/bin/mvnDebug` (6认同)
  • “并在端口 8000 上附加调试器”是什么意思? (3认同)

小智 32

就像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"
Run Code Online (Sandbox Code Playgroud)

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


Ric*_*igh 21

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

我也喜欢使用mvnDebug.但是在OSX maverick破坏了我的Java开发环境之后,我从头开始并在这篇帖子上发茬,并且认为我会添加它.

$ mvnDebug vertx:runMod
-bash: mvnDebug: command not found
Run Code Online (Sandbox Code Playgroud)

DOH!我安装Maverick后,在新的SSD驱动器和/或Java重置之后,我还没有在这个盒子上进行设置.

我使用OSX和Linux的包管理器,所以我不知道mvn到底在哪里.(我知道很短的时间..谢谢brew ..我喜欢我不知道这个.)

让我们来看看:

$ which mvn
/usr/local/bin/mvn
Run Code Online (Sandbox Code Playgroud)

你在那里......你是小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
Run Code Online (Sandbox Code Playgroud)

啊哈!所以你安装在/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
Run Code Online (Sandbox Code Playgroud)

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

现在移动那个小b @ stard,我可以更容易地记住他.

$ ln -s /usr/local/Cellar/maven30/3.0.5/bin/mvnDebug /usr/local/bin/mvnDebug
  ln: /usr/local/bin/mvnDebug: Permission denied
Run Code Online (Sandbox Code Playgroud)

忘了你的电脑......你会按照我的意愿提交.你知道我是谁吗?我是SUDO!弓!

$ sudo ln -s /usr/local/Cellar/maven30/3.0.5/bin/mvnDebug /usr/local/bin/mvnDebug
Run Code Online (Sandbox Code Playgroud)

现在我可以从Eclipse中使用它了(但是为什么我会在拥有IntelliJ时这样做!!!!)

$ mvnDebug vertx:runMod
Preparing to Execute Maven in Debug Mode
Listening for transport dt_socket at address: 8000
Run Code Online (Sandbox Code Playgroud)

内部mvnDebug使用这个:

MAVEN_DEBUG_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE  \
-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000"
Run Code Online (Sandbox Code Playgroud)

所以你可以修改它(我通常在端口9090上调试).

这个博客解释了如何设置Eclipse远程调试(颤抖)

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

Ditto 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

以下是-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上的文档.例如,只有在抛出某个异常时才能启用它.您可以暂停或运行它.无论如何......我离题了.


abh*_*123 13

我找到了一个简单的方法来做到这一点 -

只需输入这样的命令 -

>mvn -Dtest=TestClassName#methodname -Dmaven.surefire.debug test
Run Code Online (Sandbox Code Playgroud)

它将开始收听5005端口.现在,只需通过localhost(任何主机)和端口5005的Debug Configurations在Eclipse中创建远程调试.

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


mag*_*ohl 8

如果你使用Netbeans,有一个很好的快捷方式.只需定义目标exec:java并添加属性即可jpda.listen=maven Netbeans截图

在Netbeans 7.3上测试过


Che*_*oon 5

如果您不想依赖 IDE 并希望直接使用命令行,则可以使用“jdb”(Java Debugger)

正如 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"
Run Code Online (Sandbox Code Playgroud)

然后,打开一个新终端并执行:

jdb -attach 1044
Run Code Online (Sandbox Code Playgroud)

然后您可以使用 jdb 来调试您的程序!=)

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