如何使用Maven结合IDEA进行Debug

1. 介绍

由于 Idea 和 Maven class loading 的规则不同, 同样的测试使用 Maven 运行和使用 Idea 运行可能会得到不同的结果。 而我们的 CI(持续集成)往往是使用 maven 命令去运行的。
在此情况下, 将测试使用 maven 运行起来, 然后结合 IDEA 强大的 debug 能力就显得非常必要。如果熟练掌握此种 debug 方式, 也可以减少我们依赖 idea 进行编译,更新 index 这些极其耗时的工作。

2. 创建一个测试

假设我们已经创建了一个工程 maven_debug, 并且创建了一个测试类 MySuperClassTest

3. 启动 mmaven 测试并运行在 debug 模式

1
mvn -Dtest=MySuperClassTest -Dmaven.surefire.debug test
  • JVM 参数 -Dmaven.surefire.debug 即表示将测试运行在 debug 模式下
  • 这时 maven 将会首先编译测试,然后启动测试,并等待 IDE 接入 debug 模式, 此时我们要配置 IDEA 运行一个 remote JVM debug 进程, 接入 mvn debug.
  • 通常情况下, 测试将会监听在 5005 端口。

4. 配置 remote JVM debug 模板

  • 打开 idea, 从以下路径 打开 remote JVM debug 配置界面 run-> edit configurations-> Edit configuration templates -> remote JVM debug
  • 修改或检查 command line arguments for remote JVM 中的端口和其他参数正确, 端口即为上一步 mven debug 监听的端口, 默认为 5005
1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

说明

  • 这里的参数 jdwp 即为 java 的 debug 协议, 全称 Java Debug Wire Protocol
  • transport=dt_socket
  • 确保 host 参数正确, transport 参数正确
  • 参数都填写正确后, 点击 appy 按钮保存修改, 这一步完成,代表我们的 remote JVM debug 模板配置完成, 接下来我们需要基于此模版, 创建一个进程去连接 maven 测试。

5. 启动 remote JVM debug 进程

打开 run/debug configuration 界面, 路径 run-> edit configurations
点左上角+按钮, 在弹出的选择框中, 选择 remote JVM debug 模板,创建一个 run/debug 配置,点击 apply 保存。
此时在 tools bar run/debug 下拉列表就可以看到新创建的 run/debug 配置, 单击即可启动此该 remote JVM debug 进程

6. 设置断点

在 IDEA 中设置断点, 当程序运行到断点位置就会停下。

7. 其他

7.1. 如何 debug maven 插件?

如果你需要 debug 一个 maven 插件 那么需要使用另外一个 maven 命令 mvnDebug

1
mvnDebug -Dtest=MySuperClassTest test

mvnDebug 默认监听在 8000 端口, 需要启动一个 remote JVM debug 进程连接其 8000 端口, 这样即可在 IDEA 中 debug maven 插件。

1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

8. 后记

本文原文位于如何 Maven 结合 IDEA 进行 Debug, 若需最近更新, 请访问原文!

9. 参考文档

How to Debug a Test Run with Maven

Run Maven tests with -Dmaven.surefire.debug and -DforkMode=never

Java Debug Wire Protocol