文章目录
- 简介
- 一个容易混淆的问题
- mavenLocal
- Gradle查找本地仓库
- uri指定本地仓库目录
- ivy
- mavenCentral默认远程仓库
- 指定远程仓库
- flatDir本地目录
- 仓库统一管理
- 参考
简介
对于一个构建工具,仓库配置真的太重要了,Gradle非常灵活,可以处理远程仓库、本地仓库、可以读取本地目录、本地文件,甚至可以读取Maven仓库和ivy仓库(Groovy的Grapes中的Grab就使用的是ivy的仓库模式)。
真是因为Gradle的灵活,导致一个仓库问题也比较复杂,很多时候我们只是能用就没有关心,但是遇到问题可能就只能干瞪眼了。
本文就介绍一下Gradle的仓库体系。
一个容易混淆的问题
很多使用maven的朋友,刚刚接触Gradle的时候最容易混淆的事情就是把GRADLE_USER_HOME当做为maven的localRepository本地仓库一样的东西。
认为只要把GRADLE_USER_HOME设置和maven的localRepository一样,这样就可以和maven公用仓库了,减少网络下载开销,同时避免磁盘空间的浪费。
想法很棒,但是Gradle和Maven的包管理完全不一样。

实际上与Maven本地仓库localRepository对应的是GRADLE_USER_HOME\caches\modules-2\files-2.1
但实际上目录结构的设计也不一样:

个人感觉还是Maven的设计方式更合理一些,Gradle的方式如果哪天想要升级Hash算法,那不完犊子了嘛,虽然也容易解决,但是肯定会是给麻烦。
那有没有什么办法让Gradle使用Maven的库避免重复下载呢?
答案是有的:mavenLocal
mavenLocal
groovy
repositories {
mavenLocal()
}
mavenLocal的意思很简单,就是从Maven的本地仓库查找,如果没有找到就报错。
这样就可以共享Maven的仓库里,不用重复下载和避免磁盘空间浪费。
注意:Gradle官方不推荐使用这种方式,除非你是为了避免项目从Maven迁移到Gradle的兼容风险。
不过,我们自己本地测试,使用这种方式还是很香。
但是,又有新的问题,Gradle怎么找Maven本地仓库呢?
Gradle查找本地仓库
mavenLocal()的查找方式:
- 用户配置优先:查找【C:/Users/<用户名>/.m2/settings.xml】 文件中 标签指定的路径
- 如果上一步未找到,则查找【M2_HOME/conf/settings.xml】文件中指定的路径,M2_HOME是环境变量,通常配置Maven安装目录
- 如果以上两步均未找到有效配置,使用默认路径【C:/Users/<用户名>/.m2/repository、/home/<用户名>/.m2/repository】
我们使用Maven,通常不会使用默认的仓库地址,也基本不会配置环境变量M2_HOME,要怎么使用本地Maven仓库呢?
uri指定本地仓库目录
可以通过uri的方式来指定本地仓库目录:
groovy
repositories {
// mavenCentral()
maven {
// url = 'https://maven.aliyun.com/repository/public'
url = uri("D:\\repository")
}
}

注意:配置了本地仓库就不会从其他仓库下载了,所以最好再配置一个兜底。
groovy
repositories {
maven {
url = uri("D:\\repository")
}
maven {
url = 'https://maven.aliyun.com/repository/public'
}
}
ivy
除了支持maven格式,还支持ivy,Groovy的Grab使用的就是ivy。
groovy
repositories {
ivy {
url = file("C:\\Users\\trayv\\.groovy\\grapes")
}
}

我们可以看到ivy的Layout又不一样。
mavenCentral默认远程仓库
groovy
repositories {
// 如果没有配置,默认去远程仓库https://repo.maven.apache.org下载
mavenCentral()
}
指定远程仓库
groovy
repositories {
maven {
// 仓库名字,可选
name = "aliyun-maven"
url = "https://maven.aliyun.com/repository/public"
// 高版本gradle必须是https,如果使用的是http地址,增加这个选项,否则出错
allowInsecureProtocol = true
}
}
flatDir本地目录
Gradle还可以直接指定文件目录,这个和uri指定目录的区别是:uri指定的是仓库目录,有特定结构,比如遵循Maven的规范。
flatDir从名字就可以看出来,这是一个扁平的目录结构,就是会直接找jar包,不会依赖其他。
这种依赖第三方jar包的时候非常有用,比如买了一个服务,没有源码、没有私服,只有一个jar包,就可以使用flatDir
groovy
repositories {
flatDir {
dirs 'E:\\ptool\\apache-jmeter-5.6.3\\lib'
}
}
注意:flatDir的优先级比较低,如果配置了其他仓库,Gradle会优先去其他仓库获取,没有获取到才会使用flatDir
仓库统一管理
老的玩法是定义在build.gradle的allprojects中,新的玩法是定义在settings.gradle(.kts)文件中。
groovy
dependencyResolutionManagement {
repositoriesMode = RepositoriesMode.PREFER_PROJECT
repositories {
mavenCentral()
}
}
repositoriesMode = RepositoriesMode.PREFER_PROJECT的意思是如果项目定义了单独的仓库,优先使用项目中的。