我在 IntelliJ IDEA 社区版上调试 Java spring-boot 应用程序时遇到了困难。主要问题是,IDE 不会在断点处停止,即使程序肯定会通过它执行。如何使 IntelliJ IDEA 在断点处停止?
作为附加信息,这是我的运行配置:
Maven 配置命令为:spring-boot:run。在启动之前,我构建了项目。
原文由 Ville Miekk-oja 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在 IntelliJ IDEA 社区版上调试 Java spring-boot 应用程序时遇到了困难。主要问题是,IDE 不会在断点处停止,即使程序肯定会通过它执行。如何使 IntelliJ IDEA 在断点处停止?
作为附加信息,这是我的运行配置:
Maven 配置命令为:spring-boot:run。在启动之前,我构建了项目。
原文由 Ville Miekk-oja 发布,翻译遵循 CC BY-SA 4.0 许可协议
tldr:您可以尝试像这样调整命令行:
spring-boot:run -Dspring-boot.run.fork=false
解释:
在调试模式下运行应用程序时,IntelliJ 调试器附加到它自己启动的 Java 进程(通过将适当的参数 -agentlib:jdwp
等附加到 Java 命令行)。
通常,这些 Java 进程然后可能会派生一个新实例,该实例 不会 获得相同的参数,并且因为它在一个单独的进程中,所以不会连接到调试器。这可能令人困惑。
spring-boot:run
Maven 的目标,除了分叉一个新的 JVM 之外,还造成了更多的混乱,因为它有时会分叉,有时不会,这取决于它获得的选项等等。其中一些可以在 文档 中找到,但并不总是很明显。
您应该首先检查 Java 进程是否确实在被调试。当您从 IntelliJ 启动应用程序时,您会看到消息在运行/调试选项卡中滚动。在顶部,有正在执行的命令行。它应该包含调试器参数( -agentlib:jdwp
等),并且后面应该有一条消息“已连接到目标 VM”,这是调试器确认它有联系。
接下来,如果您不确定 JVM 是否已 fork,您可以检查操作系统中的进程列表,例如在 MacOS 和 *nix 下您可以使用 ps aux | grep java
。 Java 进程通常有一个巨大的参数列表,其中大部分是类路径。实际运行的应用程序在命令行的最后。如果 JVM 是分叉的,则您有运行 Maven 目标的进程,以及运行 Spring 应用程序的另一个进程。然后你的调试器将连接到你 不 感兴趣的进程,你的断点将不起作用。
要停止 spring-boot:run
分叉,您可以使用上面的 fork
参数。
原文由 Abdullah Gürsu 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答1.2k 阅读✓ 已解决
4 回答1.2k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
2 回答705 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.6k 阅读
2 回答1.3k 阅读
我让它工作的唯一方法是创建一个单独的远程调试配置。
所以去编辑配置->远程->+。然后通过intelliJ正常启动你的应用程序。然后切换到新创建的远程配置。不要运行它,而是按调试。现在调试器应该准备好了,您可以设置断点,调试器将停止它们。
编辑:对我来说,调试端口已经启用,但我发现并不是每个人都这样。如果您收到类似的错误
然后您需要在您的应用程序的 pom.xml 上启用端口。复制自@Gianluca Musa 答案:
感谢@Gianluca Musa 在他的回答中指出这一点