使用 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 下载嵌入式 MongoDb
如何使用 CommandLineJobRunner 调用嵌入在 Spring Boot 应用程序中的 Spring Batch 作业