【问题标题】:Debugging in Maven?在 Maven 中调试?
【发布时间】:2011-02-25 11:53:40
【问题描述】:

是否可以从 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 的网站或谷歌上)来描述调试的工作原理。我怀疑我必须使用一些插件。

【问题讨论】:

    标签: java debugging maven-2


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      正如布赖恩所说,你可以使用远程调试:

      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。

      【讨论】:

        【解决方案3】:

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

        对于 Maven %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-2105Dealing with Eclipse-based IDE 中的更多详细信息。

        【讨论】:

        • 在 Mac OS X 下你必须先创建一个到 mvnDebug 的链接:ln -s /usr/share/maven/bin/mvnDebug /usr/bin/mvnDebug
        • mvnDebug 真的很不错!我以前用 mavenOpts 做过这个,但这很麻烦......
        • 这救了我!这是Eclipse / M2E issue 的有效解决方法
        • 我无法让它在我的windows机器上运行,但它是一个处理所有环境问题的脚本,比如cygwin。最后我能够调试一个 Jenkins 插件。非常好的提示。
        • and attach a debugger on port 8000 是什么意思?
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          如果您使用的是 Netbeans,则有一个不错的快捷方式。 只需定义一个目标exec:java 并添加属性jpda.listen=maven

          在 Netbeans 7.3 上测试

          【讨论】:

          • 是的,这也是我的答案。如果您不派生 exec 插件并以“java”目标作为 maven 构建的一部分运行,那么您将调试 maven 构建,包括 exec 插件。 Netbeans 本身就是简单的。
          • 这应该被标记为答案。帮助我解决了 Netbeans 中的问题。
          【解决方案6】:

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

          我也更喜欢使用 mvnDebug。但是在 OSX maverick 破坏了我的 Java 开发环境之后,我从头开始,偶然发现了这篇文章,并认为我会添加它。

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

          DOH!在新的 SSD 驱动器和/或在我安装 Maverick 时重置所有 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 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 上的文档。例如,您只能在抛出某个异常时启用它。您可以启动它暂停或运行。无论如何..我离题了。

          【讨论】:

            【解决方案7】:

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

            只要输入这样的命令-

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

            它将开始监听 5005 端口。现在只需通过 localhost(任何主机)和端口 5005 的调试配置在 Eclipse 中创建远程调试。

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

            【讨论】:

              【解决方案8】:

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

              正如 Samuel 所提到的,稍作修改(设置暂停 = y 而不是暂停 = n,y 表示是,它暂停程序而不运行它,因此您可以设置断点来调试它,如果暂停 = 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 remote debugging command line tool

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-04-16
                • 2019-03-05
                • 2013-05-09
                • 2016-09-27
                • 1970-01-01
                • 1970-01-01
                • 2011-02-08
                • 2013-12-04
                相关资源
                最近更新 更多