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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:06:00