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

Posted

技术标签:

【中文标题】如何使用 IntelliJ IDEA 社区版调试 spring-boot 应用程序?【英文标题】:How to debug spring-boot application with IntelliJ IDEA community Edition? 【发布时间】:2017-10-21 03:46:59 【问题描述】:

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

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

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

【问题讨论】:

你是在调试模式下运行的吗? 是的,我做到了..... 这里有一个maven spring boot插件docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…你试过了吗? 我有 spring-boot-maven-plugin。虽然我没有在 pom.xml 中定义它的任何配置。如果我理解正确的话,可以试试那个…… @VilleMiekk-oja,如果一切配置正确,打开右侧的“Maven Project”选项卡,然后右键单击那里的bootRun选项 【参考方案1】:

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

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

解释:

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

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

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

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

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

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

【讨论】:

这为我解决了这个问题。我尝试了JAVA_OPTSDrun.jvmArguments 没有任何成功。 这是完美的解决方案,对我有用.. 解释很清楚。 这拯救了我的一天! 这帮助我克服了无法使用 IntelliJ IDEA 2019.3.4 调试 Spring Boot 应用程序的问题。非常感谢! 就是这样!完美运行。【参考方案2】:

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

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

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

【讨论】:

看看 IntelliJ 的控制台会很有趣,看看它实际在做什么,以及为什么它与其他启动带有调试器的应用程序的方式不同。 Idea 将自己的调试配置添加到 JVM 并在任意端口上开始调试,而不是使用您预定义的调试属性。 在我的情况下不起作用,intellij 仍然没有在断点处停止 这对我有用。我的项目是springboot rest backend,jar包,内嵌tomcat,idea调试完美!【参考方案3】:

对我来说,这些步骤有效:

    选择菜单运行 -> 编辑配置... 新建遥控器 配置。默认情况下,您不需要更改设置:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005。 但是如果你想在连接之前暂停 JVM,你 可以更改suspend=y。或者您可以更改端口等。 根据您的 JVM 版本复制命令行并保存配置。 在终端窗口中运行您的应用程序(在 Maven 用例和 JVM 1.5 及更高版本中)mvn clean spring-boot:run -Dspring-boot.run.jvmArguments="-agentlib:jdwp=transport=dt_socket,服务器=y,挂起=n,地址=5005" 通过运行您之前在第 2 步中创建的远程配置连接到您的应用。现在您可以调试您的应用了。

【讨论】:

如果有人使用复制粘贴:-Drun:jvmArguments= 应该是 -Drun.jvmArguments=(点而不是冒号) 我实际上需要将它添加到 pom.xml,因为 spring-boot 忽略了 -Drun... 参数:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.0.3.RELEASE</version> <configuration> <jvmArguments>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005</jvmArguments> </configuration> </plugin> 在 Intellij 中,您还可以转到运行配置中的 Runner 选项卡并将这些参数 (-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005) 粘贴到 VM Options 输入中。【参考方案4】:

我发现在我的构建中包含 Spring Dev Tools 会导致 IntelliJ 调试中断(根据您上面的描述)。如果您不使用此功能,则只需将其从您的构建中删除。

如果使用 Maven,应该从 pom.xml 中删除以下行。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>

【讨论】:

此导入事实未反映在 spring-devtools 文档 docs.spring.io/spring-boot/docs/current/reference/html/… 中。谢谢。【参考方案5】:

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

所以去编辑配置-> 远程-> +。然后通过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 在他的回答中指出这一点

【讨论】:

优秀的解决方案;也适用于我的设置:IntelliJ 2018.2、Maven 3.5.4 以调试 spring-boot 1.3.6 应用程序(Java 8)。荣誉。 Unable to open debugger port (localhost:5005): java.net.ConnectException "Connection refused: connect" 仍然适用于 IntelliJ Ultimate 2020.3 版【参考方案6】:

piphonom 的 anwser 很好,但你需要做更多的事情,就像这样将 jvmArguments 添加到 maven 插件中

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

有关 Spring Boot 项目远程调试的更多信息,请阅读this

【讨论】:

没有帮助。也许调试端口是随机的,它不受 maven 插件配置的约束 这对我很有用。 suspend=y 导致构建等待调试器附加,这对于调试与初始化相关的问题也非常有用。 openjdk 15 2020-09-15 OpenJDK 运行环境(build 15+36-1562) OpenJDK 64-Bit Server VM(build 15+36-1562,混合模式,共享) Apache Maven 3.6.3 IntelliJ 2020.3.2 Spring Boot 2.4。 2【参考方案7】:

    在应用的 pom.XML 上启用调试端口 喜欢:

    org.springframework.boot -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 配置>

    遵循 Ville Miekk-oja 的建议

    所以去编辑配置-> 远程-> +。然后开始你的 通常通过 IntelliJ 应用程序。然后切换到新的 创建远程配置。不要运行它,而是按调试。现在 调试器应该准备好了,你可以设置断点和调试器 会停下来。

【讨论】:

【参考方案8】:

很遗憾,之前的所有答案都不完整。我花了很多时间在 IntelliJ 中找到正确的远程调试方法,这里是完整的解释。

我们假设项目代码位于您的本地计算机(Windows 操作系统)中,并且您在服务器(或 VMWare 工作站)中的 Ubuntu VM 上部署了项目。并且这两台机器在同一个网络中(可以互相ping通)

首先,使用菜单运行>编辑配置添加一个新的运行/调试配置,然后点击左上角的+按钮并选择“远程”选项。保持配置参数不变,只需为新配置定义一个名称。

其次,打开 putty 并通过 SSH 连接到您的远程服务器。运行以下命令,在 putty 终端中为您的项目添加远程调试功能:

export JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

现在切换到远程服务器上项目的根目录(在同一个 putty 会话中)并使用您通常用来执行此操作的命令运行它(我的示例如下):

mvn -U clean spring-boot:run

这里是大家忽略的最重要的部分 :)

右键单击腻子会话窗口的顶部并选择“更改设置..”选项。转到左侧选项树中的路径 Connection>SSH>Tunnels。现在添加两条端口转发记录如下图(一个Local,将localhost的5005端口转发到你的远程服务器IP相同的端口号,一个Remote,将远程5005端口转发到localhost机器上的5005端口)

最后回到 IntelliJ 并从运行菜单中选择您之前添加的配置,然后点击调试按钮。您的本地 IntelliJ IDEA 现在应该已连接到您的项目的远程部署,可以调试了!!

【讨论】:

这对我有用。谢谢!唯一的区别是我的项目已经有它的 JAVA_OPTS,所以我最终将这一行添加到我的 shell 脚本中:export JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"【参考方案9】:

在 inteliJ 上转到运行-> 编辑配置-> 按“+”-> 选择“应用程序”

填写字段:主类、工作目录、模块的类路径

【讨论】:

【参考方案10】:

Spring boot maven插件(> 2.2.0)forks应用进程。因此,在调试模式下启动的旧“spring-boot:run”不会在断点处停止。

你有两个选择:

1.直接运行主类 See application configuration

2。远程调试

2.1。配置spring-boot-maven-plugin为enable remote debug

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

2.2。运行服务器 See maven configuration

2.3。运行调试服务器 See remote JVM debug configuration

【讨论】:

以上是关于如何使用 IntelliJ IDEA 社区版调试 spring-boot 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

IDEA社区版断点调试无效问题解决

Intellij Idea 社区版中的 Tomcat

text IntelliJ IDEA社区版构建WAR

社区版Intellij IDEA安装Spring Boot Assistant插件解决yml无提示问题

intellij idea15的golang插件怎么配置

使用 IntelliJ IDEA 进行调试时如何解析 JSP 中的 Spring 模型变量?