如何使用 IntelliJ IDEA 社区版调试 spring-boot 应用程序?

新手上路,请多包涵

我在 IntelliJ IDEA 社区版上调试 Java spring-boot 应用程序时遇到了困难。主要问题是,IDE 不会在断点处停止,即使程序肯定会通过它执行。如何使 IntelliJ IDEA 在断点处停止?

作为附加信息,这是我的运行配置:

Maven 配置命令为:spring-boot:run。在启动之前,我构建了项目。

原文由 Ville Miekk-oja 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

我让它工作的唯一方法是创建一个单独的远程调试配置。

所以去编辑配置->远程->+。然后通过intelliJ正常启动你的应用程序。然后切换到新创建的远程配置。不要运行它,而是按调试。现在调试器应该准备好了,您可以设置断点,调试器将停止它们。

编辑:对我来说,调试端口已经启用,但我发现并不是每个人都这样。如果您收到类似的错误

'Unable to open debugger port (localhost:5005): java.net.ConnectException "Connection refused: connect"

然后您需要在您的应用程序的 pom.xml 上启用端口。复制自@Gianluca Musa 答案:

 <plugin>
<groupId>org.springframework.boot</groupId>
<configuration>
<jvmArguments>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
</jvmArguments>
</configuration>
</plugin>

感谢@Gianluca Musa 在他的回答中指出这一点

原文由 Ville Miekk-oja 发布,翻译遵循 CC BY-SA 4.0 许可协议

tldr:您可以尝试像这样调整命令行:

 spring-boot:run -Dspring-boot.run.fork=false

解释:

在调试模式下运行应用程序时,IntelliJ 调试器附加到它自己启动的 Java 进程(通过将适当的参数 -agentlib:jdwp 等附加到 Java 命令行)。

通常,这些 Java 进程然后可能会派生一个新实例,该实例 不会 获得相同的参数,并且因为它在一个单独的进程中,所以不会连接到调试器。这可能令人困惑。

spring-boot:run Maven 的目标,除了分叉一个新的 JVM 之外,还造成了更多的混乱,因为它有时会分叉,有时不会,这取决于它获得的选项等等。其中一些可以在 文档 中找到,但并不总是很明显。

您应该首先检查 Java 进程是否确实在被调试。当您从 IntelliJ 启动应用程序时,您会看到消息在运行/调试选项卡中滚动。在顶部,有正在执行的命令行。它应该包含调试器参数( -agentlib:jdwp 等),并且后面应该有一条消息“已连接到目标 VM”,这是调试器确认它有联系。

接下来,如果您不确定 JVM 是否已 fork,您可以检查操作系统中的进程列表,例如在 MacOS 和 *nix 下您可以使用 ps aux | grep java 。 Java 进程通常有一个巨大的参数列表,其中大部分是类路径。实际运行的应用程序在命令行的最后。如果 JVM 是分叉的,则您有运行 Maven 目标的进程,以及运行 Spring 应用程序的另一个进程。然后你的调试器将连接到你 感兴趣的进程,你的断点将不起作用。

要停止 spring-boot:run 分叉,您可以使用上面的 fork 参数。

原文由 Abdullah Gürsu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题