Gradle构建生成全项目排序依赖列表及解决安全警告方案
解决Gradle依赖列表生成的安全与执行时机问题
核心实现思路
要满足生成完整依赖列表、排序、仅显式触发、消除警告的需求,关键在于将配置解析逻辑延迟到任务执行阶段,同时通过惰性任务注册确保仅在需要时运行。
完整代码实现
在项目根目录的build.gradle中添加以下代码:
tasks.register("listDependencies") { // 仅当显式调用该任务时才执行 onlyIf { gradle.startParameter.taskNames.contains("listDependencies") } doLast { // 按名称排序所有项目(含根项目) def sortedProjects = allprojects.sort { it.name } sortedProjects.each { project -> println "\n=== ${project.name} 依赖列表 ===" // 解析runtimeClasspath配置(可替换为compileClasspath等其他配置) def resolvedConfig = project.configurations.runtimeClasspath.resolvedConfiguration // 按group、name、version排序所有依赖(直接+传递) def sortedDependencies = resolvedConfig.allDependencies.sort { a, b -> int groupCompare = a.group.compareTo(b.group) if (groupCompare != 0) return groupCompare int nameCompare = a.name.compareTo(b.name) if (nameCompare != 0) return nameCompare a.version.compareTo(b.version) } sortedDependencies.each { dep -> // 过滤掉项目间依赖(如果不需要显示可保留) if (!(dep instanceof ProjectDependency)) { println "* ${dep.group}:${dep.name}:${dep.version}" } } } } }
关键细节说明
仅显式触发任务
通过onlyIf条件判断,只有当命令行中包含listDependencies任务时,才会执行后续逻辑,完全不影响正常构建流程。消除不安全配置解析警告
将resolvedConfiguration的解析逻辑放在doLast块中——这部分代码仅在任务执行阶段运行,而非配置阶段,避免了Gradle对提前解析配置的安全警告。排序保证可追踪性
- 项目按名称排序,确保输出结构固定;
- 依赖按
group→name→version排序,方便对比不同构建的依赖变化,快速定位版本差异。
依赖版本准确性
使用resolvedConfiguration获取的依赖版本是Gradle最终解析后的确定版本,不会出现null值,同时包含所有传递依赖。
使用方式
在终端执行以下命令即可生成依赖列表:
./gradlew listDependencies
内容的提问来源于stack exchange,提问作者Aaron Digulla
相关产品推荐
相关产品推荐

