如何使用Gradle调试Spring应用程序
如何使用Gradle调试Spring应用程序
对于通过Google搜索并想知道如何启用Spring的调试模式(通常通过java -jar app.jar --debug
实现)并使用Gradle的人们,这里是解决方法。这将--debug
传递给主类,这是您打开Spring Boot的调试模式的方式,其中记录了自动配置类等内容。
./gradlew bootRun --args='--debug'
当您在Gradle中运行Spring应用程序时,如果希望启用Spring Boot的调试模式,可以使用上述命令。这将在命令行中将--debug
参数传递给主类,从而打开Spring Boot的调试模式,并记录自动配置类等信息。
问题的原因是使用gradle bootRun --debug-jvm
命令使gradle构建在调试模式下运行,但实际上想要实现的是通过springBoot任务在调试模式下启动应用程序。解决方法是在build.gradle文件中配置bootRun任务,添加调试配置。
对于build.gradle文件,配置如下:
bootRun { jvmArgs=["-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=32323"] }
对于build.gradle.kts文件,配置如下(禁用暂停模式):
tasks {
val bootRun by getting(BootRun::class) {
jvmArgs=listOf("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=32323")
}
}
如果服务器在云上,想要从本地机器进行调试,需要确保服务器允许外部连接。在这种情况下,可以使用以下配置:
tasks { val bootRun by getting(BootRun::class) { jvmArgs=listOf("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:32323") } }
需要注意的是,地址现在是0.0.0.0:port
,而不仅仅是port
。
最后,需要指出的是,--debug-jvm
命令并不会调试主gradle进程。bootRun进程是JavaExec的子类,当接收到--debug-jvm
标志时,会在调试模式下启动一个子进程。
如何使用Gradle调试Spring应用程序
当你运行gradle bootRun --debug-jvm
命令时,应用程序会暂停,直到你连接调试器到它监听的端口(端口5005)。
如果在运行gradle bootRun --debug-jvm
命令时遇到问题,而且进度在96%时停在了“Building 96% > :
默认情况下,调试端口是5005。如果要从自定义端口(比如5006)开始调试,应该怎么做呢?
另外,如果不想暂停应用程序,要如何启动调试呢?
我没有针对bootRun
进行过测试,但是BootRun
任务扩展了JavaExec
(github.com/spring-projects/spring-boot/blob/master/…),我使用JavaExec
并通过jvmArgs
参数使其工作,因此您可以采用类似的逻辑:stackoverflow.com/a/53946140/4850646。