如何使用IntelliJ IDEA社区版调试弹簧启动应用程序?

2022-08-31 08:55:39

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

作为其他信息,以下是我的运行配置:

使用命令进行 Maven 配置:spring-boot:run。在启动之前,我构建项目。


答案 1

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

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

解释:

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

通常,这些 Java 进程可能会分叉一个新实例,该实例不会获得相同的参数,并且由于它位于单独的进程中,因此未连接到调试器。这可能会令人困惑。

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

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

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

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


答案 2

唯一对我有用的方法是直接从Intellij Idea运行或调试应用程序。只是开放类,其中包含

 public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }

然后点击鼠标右键 - >调试我的应用程序


推荐