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. 启动调试流程
- 启动待调试的程序:
gradle runApp
程序会输出类似Listening for transport dt_socket at address: 5005的日志,等待调试器连接。
- 打开新的终端,执行jdb命令,传入之前复制的源码路径和连接参数:
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=5005 -sourcepath "复制的源码路径字符串"
5. 调试操作说明
- 单步进入依赖包代码:使用
step命令(而非next,next会跳过方法调用),当执行到依赖包的方法时,jdb会自动进入对应的源码。 - 查看依赖包源码:在jdb中执行
list命令,即可显示当前执行位置的依赖包源代码。
内容的提问来源于stack exchange,提问作者xralf
相关产品推荐
相关产品推荐

