如何调试与 IntelliJIDEA 社区版春季启动应用程序?

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

As additional information, here is my run configurations:

Maven 配置,命令为: spring-boot: run。

136671 次浏览

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

因此,转到编辑配置-> 远程-> + 。然后通过 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 在他的回答中指出了这一点

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

  1. Select menu Run -> Edit Configurations...
  2. 创建新的远程 Configuration. By default you don't need to change settings:
    - agentlib: jdwp = Transport = dt _ socket,server = y,susch = n,address = 5005 . 但是,如果您希望在连接之前挂起 JVM,则 可以改变 悬挂 = y。或者你可以改变端口等。
  3. 根据 JVM 版本复制命令行并保存配置。
  4. 在终端窗口运行你的应用程序(在 Maven 用例和 JVM 1.5及更高版本中) mvn clean spring-boot:run -Dspring-boot.run.jvmArguments="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
  5. 通过运行之前在步骤2中创建的远程配置连接到您的应用程序。现在您可以调试您的应用程序。

Tldr: 您可以尝试像下面这样调整命令行:

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

说明:

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

通常,这些 Java 进程可能会生成一个新的实例,即 没有获得相同的参数,并且因为它位于单独的进程中,所以不连接到调试器。这可能会让人困惑。

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

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

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

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

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

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

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

Piphonom 的回答很好,但是您需要做更多的工作,就是像这样将 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>

有关弹簧引导项目的远程调试的详细信息,请阅读 这个

我发现在我的构建中包含 SpringDev Tools 会导致 IntelliJ 调试中断(根据上面的描述)。如果您不使用这个特性,那么只需从您的构建中删除它。

如果使用 Maven,下面的代码行应该从 pom.xml 中删除。

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

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

填写字段: main class,工作目录,class spath of module

  1. 启用应用程序 pom.XML 上的调试端口 例如:

    < 插件 > < groupId > org.springframework.boot < 配置 > < jvmArguments > - Xdebug-Xrunjdwp: Transport = dt _ socket,server = y,susch = y,address = 5005

  1. 遵循米克奥哈村的建议

    因此,转到编辑配置-> 远程-> + 应用程序,然后切换到新的 创建远程配置。不运行它,按调试。现在 debugger should be ready, and you can set breakpoints and the debugger 会停下来。

不幸的是,以前的所有答案都是不完整的。我花了很多时间在 IntelliJ 中寻找远程调试的正确方法,下面是完整的解释。

我们假设项目代码在你的本地机器(Windows 操作系统)中,你的服务器(或者你的 VMware Workstation)中有一个 Ubuntu 虚拟机上的项目部署。这两台机器在同一个网络中(它们可以互相 ping)

First of all, add the a new Run/Debug configuration using the menu Run>Edit Configuration and then hit the + button at the top left corner and choose the "Remote" option. Keep the configuration parameters as is and just define a name for your new config.

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

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

现在切换到远程服务器上项目的根目录(在相同的 putty 会话中) ,并使用您通常使用的命令运行它(例如,我的命令如下) :

mvn -U clean spring-boot:run

Here comes the most important part that everybody neglected here :)

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

enter image description here

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

enter image description here

Spring boot maven plugin (> 2.2.0) forks application process. So the good old "spring-boot:run" started in debug mode doesn't stop on breakpoints.

你有两个选择:

1. 直接运行主类 See application configuration

2. 远程调试

2.1. 将 spring-boot-maven-plugin 配置为 启用远程调试

<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. Run server 参见 maven 配置

2.3. Run debug-server See remote JVM debug configuration

你可以在 IntelliJ 社区版本中使用这个变通方法用标准模块(通过 mvn spring-boot: run)调试 java 应用程序,而不需要在 intelliJ 配置中创建一个专用的调试侦听器(它将在运行时创建) :

在 maven 菜单中(默认在屏幕右侧) ,点击“ Executemaven 目标”按钮:

click the button the arrow points to

然后输入这个目标: mvn spring-boot:run -Dspring-boot.run.jvmArguments="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000" (您可能需要更改端口,以便在 intelliJ 的调试器和您的应用程序之间进行协调)

这将启动您的 Spring 启动应用程序,但它将挂起。在下面的 run菜单中,您将看到一个按钮 Attach debugger

click the button the arrow points to, at the bottom of the image

单击它,然后就可以看到: 您的 Spring-boot 应用程序将运行,并且将命中断点。

注意:@stinger 提供的解决方案只适用于 IntelliJ Ideas Ultimate Edition,不适用于 IntelliJ Community Edition,也就是问题中提到的那个版本,但我还没有足够的声誉来评论他的回答。如果您使用终极版,他的解决方案仍然是首选的