如何使用 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_OPTS
和Drun.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 上启用调试端口 喜欢:
-
遵循 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 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章