Gradle构件存储疑问:.m2与gradle\caches的适用场景及本地依赖问题
嘿,这个问题问到点子上了!搞本地构建依赖问题时,摸透Gradle的缓存逻辑绝对是关键。我给你理清楚这两个目录的使用场景:
Gradle 把构件存在
.m2 目录的场景 .m2 本质是Maven的本地仓库目录,Gradle只有在和Maven兼容相关的场景下才会往这里存东西:
- 发布自家项目到本地Maven仓库时:如果你用了
maven-publish插件,执行publishToMavenLocal任务,Gradle就会把你项目打包好的jar、pom等构件存到.m2/repository里,方便其他用Maven或Gradle的项目直接引用。另外老版本的maven插件里的install任务,也是干这个事儿的。 - 配置了
mavenLocal()作为依赖源,且主动同步依赖到本地Maven仓库时:默认情况下Gradle不会把下载的依赖同步到.m2,但如果你手动配置了相关的同步策略(比如通过ResolutionStrategy),拉取的远程依赖就会被同步到这里。 - 其他工具(比如Maven)下载的依赖,或者你手动放到
.m2的构件:虽然不是Gradle主动存的,但当Gradle在依赖解析时,如果mavenLocal()在仓库列表里,它会优先去.m2找这些现成的构件。
Gradle 把构件存在
gradle/caches 目录的场景 这个是Gradle自己的核心缓存目录,绝大多数构建相关的缓存都存在这里:
- 拉取远程仓库的所有依赖:不管是从Maven Central、私有仓库还是其他远程源拉的jar、aar、pom等依赖文件,Gradle都会默认缓存到
gradle/caches/modules-2/files-2.1目录下,这样后续构建就不用重复下载,大大提速。 - 构建过程中生成的各类缓存文件:比如编译后的类文件缓存、增量构建的状态缓存、Gradle插件的缓存(存在
gradle/caches/plugins)、构建脚本的编译缓存等等,这些都是Gradle为了优化构建速度自动生成的。 - 多模块项目的内部依赖缓存:在多模块项目里,模块之间的依赖产物(比如某个子模块打包好的jar)会被Gradle缓存到这里,其他模块引用时直接用缓存,不用每次都重新构建依赖模块。
- Gradle Wrapper下载的Gradle发行版:如果你用Gradle Wrapper管理Gradle版本,下载的对应版本Gradle会存在
gradle/caches/wrapper/dists里,下次用同版本就不用再下载了。
排查依赖问题的小Tips
如果遇到依赖找不到、版本冲突或者缓存损坏的问题,可以试试:
- 执行
./gradlew clean build --refresh-dependencies,强制Gradle刷新依赖,重新拉取所有远程依赖。 - 直接删除
gradle/caches目录下对应的缓存文件夹,或者整个缓存目录,让Gradle从头开始构建缓存。 - 检查你的
build.gradle仓库配置,确认依赖的来源优先级,是不是不小心把mavenLocal()放在了远程仓库前面,导致用到了本地旧的依赖。
内容的提问来源于stack exchange,提问作者letthefireflieslive
相关产品推荐
相关产品推荐

