如何在IntelliJ IDEA中调试Maven目标?

141

你能使用Intellij IDEA调试一个maven目标吗?我知道我可以右键单击并运行Debug。然而,maven插件不出现在我的External Libraries列表中,所以我无法进入代码并设置断点。因此,Debug运行目标而不停止,就像Run一样。

我正在使用OS X 10.8和IDEA 12.0.2。

编辑:目标

我为https://github.com/searls/jasmine-maven-plugin编写了自定义specRunner-然而,$specs$保持为空。所以我尝试看看实际加载了哪些文件。


3
“调试一个Maven目标”是什么意思?什么是“Maven目标”?你想要实现什么目标?你实际遇到的问题是什么? - Alonso Dominguez
我所指的maven目标是jasmine:test或者jasmine:bdd。据我所见,每个Mojo都必须实现一个execute()方法,我想要调试这个方法。然而,由于我在IDEA中无法访问到JAR文件,所以无法设置断点。 - rweng
9个回答

251

找到解决方法:

  • 从命令行中,使用mvnDebug而不是mvn来运行maven目标。例如:mvnDebug clean
  • 在IntelliJ中打开您想要调试的maven插件的源代码,并设置断点
  • 在IDEA中,添加一个Remote JVM Debug配置。
    1. 在设置下设置:
      • 传输方式:Socket
      • 调试器模式:Attach
      • 主机:localhost
      • 端口:8000(mvnDebug的默认端口)
  1. 以调试模式运行配置。它应该连接到等待的mvnDebug jvm。

7
在Intellij中如何打开Maven插件的源代码? - CorayThan
1
我认为我已经从Github上克隆了正确版本。其余的操作都是自动完成的。 - rweng
7
如果我想使用 mvn test -Dtest=com.example.MyTest 运行测试(只有在使用 Maven 运行时我的测试用例才会失败)- 在这种情况下,似乎 IDEA 断点不起作用... :( - RobertG
3
找到了:在 https://dev59.com/02w15IYBdhLWcg3wfr5x,基本上就是所问的问题。 - RobertG
1
这个指南也有截图。 - Leponzo
显示剩余2条评论

59

非常简单。 我正在使用Intellj Idea 15.0.4

  1. 在您的Maven插件中设置断点
  2. 在“Maven项目”标签中,进入正在使用您的Maven插件的项目。
  3. 在“插件”中找到您的插件,在目标上右键单击并调试

以下是截图:

screenshot


1
尽管这个答案得分为负数,但它确实帮助我解决了我遇到的问题(如何在IntelliJ中调试基于Maven的项目),并且当我在“谷歌”这个问题时,它引导我来到了这个页面。 - gbmhunter
4
在您的Maven插件中设置断点。这与在Java类本身中设置断点不同。 - Alkanshel
1
“在你的Maven插件中设置断点”意味着在你的Maven插件类中放置断点。 - gorums
我认为问题在于,“maven插件”是什么并不清楚。我没有构建一个maven插件,我正在尝试调试一个Java应用程序。因此,我的应用程序不会显示在mavin插件列表中。 - Hephaestus
在IntelliJ的最新发布版中,菜单仅称为Maven,并位于右侧。 - Luiz Rossi
显示剩余3条评论

29

虽然这是一个老问题,但我也有同样的需求,花费了一些时间才使其正常工作。希望能帮到别人。

进行测试调试时,请使用以下方法:

mvn <goal> -Dmaven.surefire.debug

或者
mvn <goal> -Dmaven.failsafe.debug

当程序执行停止并侦听地址5005(默认值)上的套接字时,您可以运行配置的远程调试器。

如何进行配置:

运行 -> 编辑配置 -> 远程传输:socket 调试器模式:附加 端口:5005(默认值)

-> 保存。


18

我认为最简单的解决方法是将Maven插件作为一个临时依赖添加进来。这样一来,IntelliJ就会像对待其他任何依赖一样来处理它,你可以按照平常的方式设置断点。


2
使用点操作符(.)替代此处的“dot this”,并且在命令中使用“mvnDebug”而不是“mvn”。然后,在IntelliJ中创建一个远程调试器,端口为8000。 - user85155
1
1000倍重要!我试图调试一个第三方插件,将其作为普通的Maven依赖项添加意味着我可以轻松地下载源代码,搜索我知道有问题的类(基于Github日志),并设置断点。如其他人所提到的,右键单击所需的Maven目标并选择“Debug”完美地解决了问题。 - Patrick Herrera

15

在IntelliJ中仅调试Maven目标的最简单方法是创建一个常规的Maven目标,在运行器选项卡中传递这些VM选项:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

8000是远程调试的端口号。

Maven goal configuration

然后创建一个使用8000端口的新远程调试配置。在运行maven目标之后运行此配置。

Remote debugging configuration


5

不需要设置Java Remote Debugger或任何其他东西。现在只需在Maven目标上单击鼠标右键->debug,如官方文档所述。


3

您可以参考上面的答案,或者只需将此插件添加到pom.xml中即可。

           <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
            <jvmArguments>
            -Xdebug - 
            Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
            </jvmArguments>
            </configuration>
        </plugin>

使用mvn而不是mvnDebug来运行maven目标。例如:mvn spring-boot:run

在IDEA中,添加一个远程配置。 在设置下,将传输方式设置为Socket,调试器模式设置为Attach,主机设置为localhost,端口设置为8000(mvnDebug的默认端口)。

在IDEA中以调试模式运行,每当您想要调试代码时使用。


3
这个问题没有提到Spring,这个答案是特定于Spring的。 - Alkanshel

2
由于您正在使用Intellij,那里已经有一个内置的调试器,您不需要一定要使用mvnDebug这个命令行工具。请查看此教程:如何在Intellij IDEA中调试Maven应用程序。该教程使用了Maven Exec插件,让您可以在不使用命令行或MvnDebug的情况下调试应用程序。分享这些信息可能对您有价值。

2
本教程仅涵盖了exec:java的调试。但是,如果您需要为JVM提供额外的参数,则需要使用exec:exec(请参见http://stackoverflow.com/questions/7305090/how-to-run-a-java-project-with-vm-arguments-from-command-line),而无法以这种方式进行调试。 - mirelon

2
@Peter Szanto的答案对我有帮助,但我不想弄乱我的源代码。
而且我无法让那些MvnDebug方法起作用。
所以我尝试另一种方式,将插件源代码添加为IDEA模块。
以下是详细步骤:
1. 将插件源代码克隆为独立项目。
2. 在您的项目中,转到“文件 -> 从现有源创建新模块”并添加您在第1步中克隆的插件项目。
3. 现在您可以打开插件源代码并设置一些断点。
4. 以调试模式运行您的maven目标,它应该在断点处停止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接