如何使用 gradle 调试 spring 应用程序
Posted
技术标签:
【中文标题】如何使用 gradle 调试 spring 应用程序【英文标题】:how to debug spring application with gradle 【发布时间】:2017-01-22 06:29:50 【问题描述】:我正在开发 spring 应用程序,需要逐步执行控制器方法以查看它是如何工作的。
我正在使用 Eclipse 并使用 gradle bootRun
命令构建我的应用程序。
如何在调试模式下运行?
我试过gradle bootRun --debug
,但它只是调试日志,不是调试模式
我试过gradle help --task bootRun
——这给了我关于任务的信息
在那里我看到了--debug-jvm
选项但是当我运行时
gradle bootRun --debug-jvm
应用程序无法启动
【问题讨论】:
你看过Spring Logging了吗?这将是做到这一点的最佳方式。 请详细说明“应用程序无法启动”?您是否遇到异常? @alpar 该站点未显示在浏览器中。我看到无法访问此站点消息 如果您使用的是 Eclipse,为什么要使用 Gradle 来运行应用程序? Eclipse 是 IDE,而不是 Gradle... 【参考方案1】:在您运行 gradle bootRun --debug-jvm
后,应用程序将暂停,直到您将调试器连接到它正在侦听的端口(端口 5005)。
【讨论】:
在运行 gradle bootRun --debug-jvm 时遇到问题。挂在大楼 96% > :bootRun
测试过,但是BootRun
任务扩展了JavaExec
(github.com/spring-projects/spring-boot/blob/master/…),我使它与JavaExec
一起工作,通过jvmArgs
到任务,所以你可以应用类似的逻辑:***.com/a/53946140/4850646【参考方案2】:
作为对 dankdirkd 上述回答的回应:(compare)
gradle bootRun --debug-jvm
将使 gradle 构建在调试模式下运行。那可能不是你想要的。您想要实现的是 springBoot 任务以调试模式启动您的应用程序。
spring boot 任务扩展了 gradle JavaExec 任务。您可以在 build.gradle 文件中配置 bootRun 任务,以添加如下调试配置:
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 标志时以调试模式启动子进程。 docs.gradle.org/current/dsl/… 所以我只需将 bootRun jvmArgs=["-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=32323"] 添加到 build.gradle 中。就这样?【参考方案3】:对于build.gradle.kts
文件,您也可以在下面简单地使用:
tasks.withType<BootRun>
jvmArgs = listOf("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:32323")
【讨论】:
【参考方案4】:我个人更喜欢使用Gradle tasks
和right-clicking on the bootRun
。与终端相比,这在 IDE 中很有用。
【讨论】:
但是你如何使用 Gradle 任务在调试模式下运行应用程序?我也不喜欢使用终端的想法【参考方案5】:定义一个在子进程中执行 Java 应用程序。
task executeApp()
doFirst
println "Executing java app from Gradle..."
javaexec
main = "com.mymain"
jvmArgs = ["-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=30000"]
在 java 代码中设置断点。执行 Gradle 任务后。例如在 Windows 中:
.\gradlew.bat executeApp
任务会一直等待,直到您附加调试器。例如在 Netbeans 中转到 Debug->Attach debugger ,在端口字段上设置 30000。
【讨论】:
谢谢。这确实可以让开发人员离开断点并通过代码进行跟踪。但是,有没有一种方法可以将这两个步骤(运行应用程序和附加调试器)结合在一次执行命令或单击按钮中。 Cos 每次我们修改java代码的时候,都要停止上面的过程。然后手动执行这两个步骤。对我来说似乎是家务活。以上是关于如何使用 gradle 调试 spring 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Spring-boot 和 Gradle:构建时间太长 - 如何调试?
如何让IDEA像STS那样高效调试Spring Boot程序
教你在Windows下Gradle如何调试Spring5.2.x
教你在Windows下Gradle如何调试Spring5.2.x