
gradle 默认的 `dependencies` 任务无法显示通过 `files()` 或 `filetree()` 声明的本地文件依赖,因其不属于 maven/ivy 坐标体系;本文详解如何通过自定义任务遍历并输出 `configurations` 中所有本地 jar 文件名及路径。
在 Gradle 中,使用 files("xxx.jar") 或 fileTree(dir: "...", includes: ["*.jar"]) 声明的依赖属于 文件型依赖(File Dependencies),它们不参与 Gradle 的依赖解析与传递性分析,因此标准的 ./gradlew :myproject:dependencies --configuration infraLibs 命令只会显示 No dependencies —— 这并非错误,而是设计使然:Gradle 的 dependencies 报告仅展示基于模块坐标(如 group:name:version)的可解析依赖,而本地文件不具备这些元数据。
要真正查看 infraLibs(或任意自定义 configuration)中实际包含哪些本地 JAR,需直接访问其 Configuration.files 属性(即已解析的 FileCollection)。推荐方式是编写一个轻量级 Gradle 任务:
task printInfraLibs {
doLast {
println "=== Local JARs in 'infraLibs' configuration ==="
configurations.infraLibs.files.each { file ->
println "- ${file.name} → ${file.absolutePath}"
}
println "Total: ${configurations.infraLibs.files.size()} JAR(s)"
}
}✅ 执行命令:./gradlew printInfraLibs ✅ 输出示例:=== Local JARs in 'infraLibs' configuration === - aspectjrt-1.9.20.jar → /path/to/lib/aspectj-1.9.20/aspectjrt-1.9.20.jar - commons-lang-2.6.jar → /path/to/lib/commons-lang-2.6/commons-lang-2.6.jar - log4j-api-2.17.1.jar → /path/to/lib/log4j-2.17.1/log4j-api-2.17.1.jar Total: 3 JAR(s)
⚠️ 注意事项:
- configurations.infraLibs.files 返回的是 Set
,已自动去重且包含所有显式声明 + 间接合并(如 configurations.aspectJrt + ...)后的物理文件; - 若需更详细信息(如 SHA256 校验、依赖来源),可在循环中调用 file.length() 或 java.security.MessageDigest 计算哈希;
- 此方法不触发依赖解析(无网络请求、不下载),纯本地文件枚举,安全高效;
- 若配置未正确定义(如拼写错误或未 extendsFrom),需确保 infraLibs 已在 configurations 块中正确定义(例如 configurations.create("infraLibs") 或通过 dependencies 自动创建)。
总结:当必须使用本地 JAR 时,放弃对 dependencies 报告的依赖,转而信任 Configuration.files —— 它是 Gradle 提供的、最准确反映“当前构建实际使用哪些本地二进制文件”的权威接口。











