如何从Gradle依赖树中提取指定group名称的依赖模块名?
Gradle提取指定Group依赖模块的实现方案
你找到的代码片段功能解释
这段代码是完全符合你需求的官方API实现,逻辑逐行说明如下:
project.configurations.findAll{item -> item.canBeResolved}:筛选出项目中所有可解析的配置项。Gradle的配置分为可解析和可声明两类,类似implementation这种仅用来声明依赖的配置是不可解析的,runtimeClasspath、compileClasspath这类会实际拉取依赖生成依赖树的是可解析配置,这一步会过滤掉无意义的不可解析配置。item.incoming.afterResolve { ... }:给每个可解析配置添加解析完成后的回调钩子,确保所有依赖都完成解析、元数据完整后再执行后续逻辑,避免拿到残缺的依赖信息。resolutionResult.allComponents { ... }:遍历当前配置下所有解析完成的依赖组件,包含直接声明的依赖和间接引入的传递依赖。if(moduleVersion.group == 'org.springframework.boot'):直接读取依赖的官方元数据匹配Group,不需要任何字符串模糊匹配,精准度100%。- 最终打印匹配到的依赖模块名
moduleVersion.name。
和你当前实现的对比
你现在用的字符串匹配方案有几个明显的缺陷:
- 路径字符串匹配不精准,如果本地仓库路径、jar包名里刚好出现和目标Group重名的字符,会出现误判
- 从jar文件名截取模块名的逻辑不稳定,如果模块名本身就包含横杠,
lastIndexOf('-')会把模块名切错 - 只能拿到最终落到Classpath里的jar文件,无法灵活调整扫描范围(比如只扫直接依赖、只扫编译期依赖)
用依赖树查询的方案完全规避了上述问题,是Gradle官方推荐的依赖查询实现方式。
简化优化版本
如果你不需要扫描所有可解析配置,只需要和你当前逻辑一致,只查主代码运行时的依赖,可以把代码简化为如下版本,执行效率更高:
def targetGroup = 'org.springframework.boot' // 仅扫描runtimeClasspath,和你原方案覆盖范围一致 project.configurations.runtimeClasspath.incoming.afterResolve { resolutionResult.allComponents { if (moduleVersion.group == targetGroup) { // 可以根据需要打印版本、完整坐标等信息 println "模块名:${moduleVersion.name},版本:${moduleVersion.version}" } } }
如果你只需要获取你直接在build.gradle里声明的依赖,不需要传递依赖,可以用更简单的写法:
def targetGroup = 'org.springframework.boot' project.configurations.implementation.dependencies.each { dep -> if (dep.group == targetGroup) { println dep.name } }
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

