Maven/Gradle如何获取依赖发布日期并排序识别项目过时依赖
Maven/Gradle 依赖发布时间提取与老旧依赖识别方案
核心实现思路
不需要依赖第三方漏洞扫描接口,直接利用Maven/Gradle仓库规范自带的构件元数据,拉取每个已解析依赖的对应版本发布时间,完成排序后识别坐标迁移类的弃用依赖。
Maven 项目操作步骤
- 先执行依赖解析命令,生成全量去重的依赖坐标清单:
mvn dependency:tree -DoutputType=text -Dtokens=standard -DexcludeScope=test
过滤掉测试范围、provided范围的临时依赖,拿到所有实际打包部署的GAV坐标列表 - 对清单中的每个坐标,拉取对应远程仓库(含企业自建私服)下的
maven-metadata.xml元数据文件,提取当前解析版本对应的发布时间戳。所有符合Maven仓库规范的服务端,都会在元数据中记录每个版本的正式发布时间,无需额外请求第三方服务 - 将依赖坐标与对应的发布时间做映射,按时间戳从早到晚排序输出完整清单
Gradle 项目操作步骤
Gradle在解析依赖的过程中,会自动把构件的发布时间存在本地元数据缓存中,无需重复发送远程请求拉取。只需要在项目的构建脚本中注册一个极简任务:
tasks.register("sortedDependencyReleaseTime") { doLast { // 遍历运行时依赖的解析结果 def dependencyList = configurations.runtimeClasspath.resolvedConfiguration.resolvedArtifacts.collect { artifact -> def moduleId = artifact.moduleVersion.id // 直接从本地缓存的元数据中读取发布时间戳 def releaseTimestamp = artifact.repository.meta.getReleaseTime(moduleId) [coords: moduleId.toString(), releaseTime: releaseTimestamp] } // 按发布时间从旧到新排序 def sortedList = dependencyList.sort { it.releaseTime } // 打印输出结果 sortedList.each { println "${it.coords} 发布时间: ${new Date(it.releaseTime)}" } } }
执行构建命令即可拿到排序后的完整清单:./gradlew sortedDependencyReleaseTime
坐标迁移类依赖的识别逻辑
针对类似Awaitility这类官方迁移坐标、但旧坐标无漏洞报告的场景,可直接通过排序结果定位问题,不依赖漏洞扫描的规则匹配:
- 排序后优先查看发布时间超过3-5年未更新的老旧依赖(比如示例中2015年最后更新的
com.jayway.awaitility:awaitility) - 提取老旧依赖的artifact名称,匹配同artifact在仓库内的最新归属groupId:如果发现同artifact下存在持续更新的新groupId(比如
org.awaitility:awaitility从2020年开始持续迭代),即可直接判定原使用的旧坐标为已弃用的迁移前坐标 - 这套逻辑完全适配企业内部依赖的检测场景:只要企业私服维护了规范的元数据,哪怕依赖没有公开漏洞记录,也能通过发布时间、坐标匹配完成识别,不会出现旧坐标“无漏洞”但实际已弃用的漏检问题
内容的提问来源于stack exchange,提问作者aSemy
相关产品推荐
相关产品推荐

