如何获取Gradle项目的运行时依赖及其坐标、JAR文件路径?
Gradle遍历运行时全量依赖的自定义任务实现
前置说明
你之前提到的ResolvedDependecy拼写有误,正确类名是ResolvedDependency;另外runtime配置已经在Gradle 4.x版本后废弃,新版请使用runtimeClasspath配置,能覆盖所有运行时所需的传递性依赖。
你提到的几个术语对应关系如下:
Dependency:对应依赖的逻辑坐标信息(group、name、version)Artifact:对应依赖的物理文件(比如JAR包、源包等)Module:对应同一group+name下所有版本的依赖集合
你需要的坐标信息在ResolvedDependency层面获取,JAR路径在对应的Artifact层面获取即可。
完整实现代码
Groovy DSL版本
import org.gradle.api.artifacts.ResolvedDependency tasks.register('listAllRuntimeDeps') { // 所有解析逻辑放在执行阶段,不要放到配置阶段,避免拖慢构建速度 doLast { def resolvedRuntimeConfig = project.configurations.runtimeClasspath.resolvedConfiguration // 遍历一级依赖,递归处理所有传递依赖 resolvedRuntimeConfig.firstLevelModuleDependencies.each { resolvedDep -> walkResolvedDependency(resolvedDep) } } } /** * 递归解析依赖及其所有传递子依赖 */ def walkResolvedDependency(ResolvedDependency dep) { // 打印依赖坐标 println "坐标:${dep.moduleGroup}:${dep.moduleName}:${dep.moduleVersion}" // 打印该依赖对应的所有JAR文件路径 dep.moduleArtifacts.each { artifact -> println "JAR路径:${artifact.file.absolutePath}" } println "---" // 递归处理子依赖 dep.children.each { childDep -> walkResolvedDependency(childDep) } }
Kotlin DSL版本
import org.gradle.api.artifacts.ResolvedDependency tasks.register("listAllRuntimeDeps") { doLast { val resolvedRuntimeConfig = project.configurations.runtimeClasspath.get().resolvedConfiguration resolvedRuntimeConfig.firstLevelModuleDependencies.forEach { resolvedDep -> walkResolvedDependency(resolvedDep) } } } /** * 递归解析依赖及其所有传递子依赖 */ fun walkResolvedDependency(dep: ResolvedDependency) { println("坐标:${dep.moduleGroup}:${dep.moduleName}:${dep.moduleVersion}") dep.moduleArtifacts.forEach { artifact -> println("JAR路径:${artifact.file.absolutePath}") } println("---") dep.children.forEach { childDep -> walkResolvedDependency(childDep) } }
常见问题处理
- 如果需要去重,可以自行维护一个
Set<String>存储已经处理过的坐标(${group}:${name}:${version}),遇到重复的直接跳过即可 - 如果需要过滤出仅JAR格式的artifact,可以加判断
artifact.type == "jar" - 不要直接调用
configurations.runtimeClasspath.files,这种方式只能拿到所有JAR文件,拿不到对应的坐标信息
内容的提问来源于stack exchange,提问作者Mridang Agarwalla
相关产品推荐
相关产品推荐

