【问题标题】:How to debug spring-boot application with IntelliJ IDEA community Edition?如何使用 IntelliJ IDEA 社区版调试 spring-boot 应用程序?
【发布时间】: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选项

标签: java intellij-idea spring-boot


【解决方案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】:

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

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

【讨论】:

【解决方案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】:
  1. 在应用的 pom.XML 上启用调试端口 喜欢:

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

  1. 遵循 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

      【讨论】:

        猜你喜欢
        • 2021-09-07
        • 2016-03-15
        • 1970-01-01
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        相关资源
        最近更新 更多