使用 Spring Boot 中嵌入的 tomcat 进行远程调试或本地调试

Posted

技术标签:

【中文标题】使用 Spring Boot 中嵌入的 tomcat 进行远程调试或本地调试【英文标题】:Remote debug or local debug with tomcat embedded in Spring boot 【发布时间】:2021-10-21 19:44:57 【问题描述】:

我正在开发一个新项目,该项目嵌入了一个依赖 spring-boot-starter-tomcat:2.5.3 的 tomcat(到 vaadin-spring-boot-starter 中)。 我正在将我的项目构建为 .jar,并使用“mvn spring-boot:run”启动它。

但是由于嵌入了tomcat,我无法在Eclipse中使用调试模式。

我已经尝试启动远程调试会话,使用:

MAVEN_OPTS= -Xmx1024M -XX:MaxPermSize=256M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

Eclipse 自身连接良好,但断点不起作用,它只显示一个线程,没有更多信息。

那么,你知道我怎样才能让它工作吗? 感谢您的宝贵时间!

【问题讨论】:

【参考方案1】:

这里描述了另一种解决方案: https://vaadin.com/forum/thread/17519592/debug-with-intellij 此解决方案还帮助我解决了连接远程调试器但未到达断点的问题(请参阅我上面的评论)。

您可以在插件的配置参数中添加一个 JVM 参数,如下所示:

     <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <!-- my edits start -->
        <configuration>
            <jvmArguments>
                -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
            </jvmArguments>
        </configuration>
        <!-- my edits end -->
    </plugin>

【讨论】:

【参考方案2】:

作为第三种解决方案,我在 Eclipse Marketplace 上安装了 Spring Tools 4。 它使我能够在调试模式下启动 @SpringBootApplication,就像 Leif Astrand 所说的那样,但使​​用 IHM(引导仪表板)。

【讨论】:

【参考方案3】:

从 IDE 调试 Spring Boot 应用程序的最简单方法是根本不使用 Maven,而是直接从 @SpringBootApplication 类启动 main 方法。

【讨论】:

【参考方案4】:

当使用mvn spring-boot:run 运行应用程序时,您可以像这样附加调试器:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:8000"

通过提供spring-boot.run.jvmArguments 系统属性。

或者,您可以先构建应用程序,然后使用以下命令运行它:

java -jar app.jar -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000

当您使用 MAVEN_OPTS 提供调试器配置时,调试器将附加到 Maven 进程,但是,应用程序在没有附加调试器的单独 Java 进程中运行。

【讨论】:

它连接良好,但我的远程调试器(在 Eclipse 上)不会在断点处停止。看起来它只是连接但什么也不做。我的远程检测到它是一个 openJDK 64x,并检测到 Thread[main] 正在运行,可以在调试器停止时终止服务器。但它不会停止或显示任何有关调试的信息。 @Robyn.D 我编辑了我的答案,请检查 现在运行得非常好!非常感谢 :) “spring-boot.run.jvmArguments”属性成功了 遇到了同样的问题,但提供此 JVM 属性无助于激活断点。我正在使用 mvnw 启动脚本启动 Vaadin 应用程序,并将这样的 JVM 属性添加到最后一行:exec "$JAVACMD" \ $MAVEN_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ "-Dmaven.home=$M2_HOME" "-Dmaven.multiModuleProjectDirectory=$MAVEN_PROJECTBASEDIR" \ "-Dspring-boot.run.jvmArguments=\"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:8000\"" \ $WRAPPER_LAUNCHER $MAVEN_CONFIG "$@"

以上是关于使用 Spring Boot 中嵌入的 tomcat 进行远程调试或本地调试的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 中嵌入的 tomcat 进行远程调试或本地调试

spring boot 使用 jsp视图(巨坑)

如何避免使用 Spring-Boot 下载嵌入式 MongoDb

如何知道spring boot中嵌入了哪个tomcat版本

如何使用 CommandLineJobRunner 调用嵌入在 Spring Boot 应用程序中的 Spring Batch 作业

如何在 Spring Boot 集成测试中使用嵌入式 MongoDB