如何强制Gradle使用最新依赖?解决Checkmarx扫描Ivy版本问题
为满足Checkmarx漏洞扫描要求升级应用时,发现引入的org.apache.ivy版本过时,我已经通过Gradle的强制依赖配置指定了2.5.2版本:
all { resolutionStrategy { force 'org.apache.ivy:ivy:2.5.2' } }
本地执行gradlew dependencies查看依赖树,显示只有2.5.2版本,符合预期,但提交到Jenkins构建后,Checkmarx扫描仍能在Gradle缓存路径里找到旧版Ivy。以下是彻底清理旧版本的几种方法:
直接清理Jenkins节点的Gradle缓存
Jenkins的Gradle缓存默认存在~/.gradle/caches/modules-2/files-2.1/org.apache.ivy/ivy路径下,直接删除该路径下除2.5.2以外的所有版本文件夹即可。也可以在Jenkins构建脚本里加缓存清理步骤:
Linux/macOS环境执行:rm -rf ~/.gradle/caches/modules-2/files-2.1/org.apache.ivy/ivy/* rm -rf ~/.gradle/caches/modules-2/metadata-2.9/descriptors/org.apache.ivy/ivy/*Windows环境用PowerShell执行:
Remove-Item -Recurse -Force "$env:USERPROFILE\.gradle\caches\modules-2\files-2.1\org.apache.ivy\ivy\*" Remove-Item -Recurse -Force "$env:USERPROFILE\.gradle\caches\modules-2\metadata-2.9\descriptors\org.apache.ivy\ivy\*"在Gradle脚本里加缓存清理任务
在项目的build.gradle中添加一个任务,让它在依赖解析前自动清理旧版Ivy缓存:task cleanIvyCache { doLast { def ivyCacheDir = new File(System.getProperty('user.home') + '/.gradle/caches/modules-2/files-2.1/org.apache.ivy/ivy') if (ivyCacheDir.exists()) { ivyCacheDir.eachFile { file -> if (!file.name.startsWith('2.5.2')) { file.deleteDir() } } } } } dependencies { // 确保清理任务在依赖解析前执行 configurations.all.dependsOn(cleanIvyCache) }Jenkins构建时强制刷新依赖
在Jenkins的Gradle构建步骤里,勾选“Refresh dependencies”选项,或者给Gradle命令加上--refresh-dependencies参数,强制Gradle重新解析依赖,不使用缓存里的旧版本。启用Gradle依赖锁定
开启依赖锁定功能,确保项目始终用指定版本的Ivy,避免意外引入旧版本:dependencyLocking { lockAllConfigurations() }执行
gradlew dependencies --write-locks生成依赖锁文件,提交到版本库,Jenkins构建时会严格按照锁文件里的版本解析依赖。
内容的提问来源于stack exchange,提问作者mcmar

