You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle环境下如何使用jdb调试依赖包源代码

解决Gradle+jdb调试依赖包源码的问题

1. 下载依赖的源代码

Spring的io.spring.dependency-management插件仅负责依赖版本管理,不处理源码下载。要获取依赖的源码,执行Gradle内置的downloadSources任务:

gradle downloadSources

该任务会自动从Maven Central下载所有依赖对应的sources.jar,存储到Gradle本地缓存目录。

2. 配置调试用的JavaExec任务

修改build.gradle中的runApp任务,添加JVM调试参数,让程序启动后暂停等待jdb连接:

task runApp(type: JavaExec) {
    main = 'App'
    classpath = sourceSets.main.runtimeClasspath
    // 启用调试模式,监听5005端口,启动时暂停
    jvmArgs = [
        '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005'
    ]
}

3. 获取完整的源码路径

为了让jdb找到项目自身和依赖的源码,需要生成包含所有源码路径的字符串。在build.gradle中添加一个辅助任务:

task printSourcePaths {
    doLast {
        def sourcePaths = []
        // 添加项目自身的源码目录
        sourcePaths.addAll(sourceSets.main.java.srcDirs)
        // 添加所有依赖的sources.jar路径
        configurations.runtimeClasspath.resolvedConfiguration.resolvedArtifacts.each { artifact ->
            def sourceArtifact = artifact.moduleVersion.getArtifact('sources')
            if (sourceArtifact != null) {
                sourcePaths.add(sourceArtifact.file.absolutePath)
            }
        }
        // 打印用冒号分隔的路径字符串
        println sourcePaths.join(':')
    }
}

执行该任务获取源码路径:

gradle printSourcePaths

复制输出的路径字符串备用。

4. 启动调试流程

  1. 启动待调试的程序:
gradle runApp

程序会输出类似Listening for transport dt_socket at address: 5005的日志,等待调试器连接。

  1. 打开新的终端,执行jdb命令,传入之前复制的源码路径和连接参数:
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=5005 -sourcepath "复制的源码路径字符串"

5. 调试操作说明

  • 单步进入依赖包代码:使用step命令(而非next,next会跳过方法调用),当执行到依赖包的方法时,jdb会自动进入对应的源码。
  • 查看依赖包源码:在jdb中执行list命令,即可显示当前执行位置的依赖包源代码。

内容的提问来源于stack exchange,提问作者xralf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:17:33