如何使用 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 这是正确的答案,suspended意味着你需要点击remote debug按钮来连接监听器然后启动应用程序:P跨度> 默认调试端口是5005。如何从自定义端口比如5006开始? 还有,如何在没有暂停的情况下启动? @hariharankumar 我没有专门用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 tasksright-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

教你在Windows下Gradle如何调试Spring5.2.x

Gradle > 如何停止使用 gradle bootRun 启动的 Spring Boot 应用程序?