代码之家  ›  专栏  ›  技术社区  ›  aduric

在Maven中调试?

  •  57
  • aduric  · 技术社区  · 16 年前

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

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

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

    我一直在期待这样的事情:

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

    要启动调试器,但和往常一样,我的期望与Maven的理念不一致。

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

    8 回复  |  直到 10 年前
        1
  •  30
  •   Samuel Yung    16 年前

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

    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。

        2
  •  94
  •   Pascal Thivent    16 年前

    如果您使用的是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 Dealing with Eclipse-based IDE .

        3
  •  20
  •   RickHigh    12 年前

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

    我更喜欢使用 MVNDebug 也是。但是在OSX Mav里克摧毁了我的Java DEV环境之后,我从零开始,在这个帖子上胡思乱想,并认为我会添加它。

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

    呸!我没有设置它在这个盒子后,新的SSD驱动器和/或重置一切Java当我安装特立独行。

    我在OSX和Linux上使用了一个包管理器,所以我不知道MVN真正住在哪里。 (我知道有很短的一段时间..谢谢酿造。我喜欢,我不知道。)

    让我们看看:

    $ 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/cell/maven30/3.0.5/bin/mvn中。 你这个厚颜无耻的小工具。无疑是自制的…

    你有你的小伙伴吗?

    $ 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
      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"
    

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

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

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

    同上的网豆

    https://blogs.oracle.com/atishay/entry/use_netbeans_to_debug_a

    国际智力竞赛 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上的文档。例如,只有在引发某个异常时才能启用它。你可以挂起或运行它。反正…我离题了。

        4
  •  12
  •   abhihello123    10 年前

    我找到了一个简单的方法-

    只需输入这样的命令-

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

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

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

        5
  •  7
  •   magarciaschopohl    13 年前

    如果您使用的是NetBeans,那么有一个很好的快捷方式。 只需定义一个目标<代码> Exc:Java<代码>,并添加属性<代码> jpDA。

    在Netbeans 7.3上测试

    一粒进球 exec:java 并添加属性 jpda.listen=maven Netbeans screenshot

    在Netbeans 7.3上测试

        6
  •  4
  •   Community Mohan Dere    9 年前

    如果您不想依赖IDE并希望直接使用命令行,可以使用“JDB”(Java调试器)

    如塞缪尔所说,修改很小(设置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 remote debugging command line tool

        7
  •  3
  •   Community Mohan Dere    10 年前

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

        8
  •  3
  •   flurdy Nate Murray    16 年前

    我使用MaveNoopts选项,发现将暂停设置为“暂停=y”作为我的Exc: Java程序往往是小的生成器,这是在我管理调试器之前完成的。:)在挂起的情况下,它将在继续之前等待调试器附加。

    推荐文章