阿里云云效 Maven
官网:https://developer.aliyun.com/mvn/guide
阿里云Maven中央仓库为 阿里云云效 提供的公共代理仓库,帮助研发人员提高研发生产效率,使用阿里云Maven中央仓库作为下载源,速度更快更稳定。
阿里云云效 是企业级一站式 DevOps 平台,覆盖产品从需求到运营的研发全生命周期,其中云效也提供了免费、可靠的Maven私有仓库 Packages 和代码管理仓库 Codeup,欢迎您体验使用。
云效制品仓库 Packages 致力于帮助开发者统一管理各种开发语言在开发、构建过程中的依赖,构建成果(二进制制品)以及交付过程关键信息的重要组件。
云效代码管理 Codeup 是阿里云出品的一款企业级代码管理平台,提供代码托管、代码评审、代码扫描、代码度量等功能,不限人数、超大容量且免费使用,全方位保护代码资产,帮助团队实现安全、稳定、高效的研发管理。
仓库名称 | 阿里云仓库地址 | 阿里云仓库地址(老版) | 源地址 |
---|---|---|---|
central | https://maven.aliyun.com/repository/central | https://maven.aliyun.com/nexus/content/repositories/central | https://repo1.maven.org/maven2/ |
public | https://maven.aliyun.com/repository/public | https://maven.aliyun.com/nexus/content/groups/public | central仓和jcenter仓的聚合仓 |
gradle-plugin | https://maven.aliyun.com/repository/gradle-plugin | https://maven.aliyun.com/nexus/content/repositories/gradle-plugin | https://plugins.gradle.org/m2/ |
apache snapshots | https://maven.aliyun.com/repository/apache-snapshots | https://maven.aliyun.com/nexus/content/repositories/apache-snapshots | https://repository.apache.org/snapshots/ |
如上面的表格,列出了阿里仓库的新地址和老版本的地址,平时我们使用新地址即可,老版本的地址也是可以使用的,比如有些依赖在新地址中可能下载不到,但是在老版本的地址中可能还能下载到,特别是一些版本比较旧的依赖。
从老版本地址中的nexus
可以看出,它也是用的Nexus Repository OSS
,所以阿里云镜像加速的原理和Nexus Repository OSS
是一样的,当阿里云收到依赖请求时,它会把请求转发给原始仓库,比如google()仓库,下载到依赖后缓存起来,下次再有相同的依赖请求时直接返回缓存即可,这就是加速的原理。
这个表格没有列完整,在https://developer.aliyun.com/mvn/view中有更多的仓库地址,当你发现一个很少见的仓库地址时,可以到这里看看有没有对应的镜像地址。这个页面中,可以看到central仓库的类型是proxy,而public的类型是group,如下:
这和Nexus Repository OSS
私服仓库中的概念是一样一样的。public仓库其实是一个组,把多个仓库组合起来,它把jcenter
和central
组合到一起。
Android项目默认使用的Maven仓库都有哪些?
在Android中如何使用阿里云效Maven呢?首先我们新创建一个Android项目看看默认的仓库地址有哪些,当前是2025年3月27日,使用最新版本Android Studio创建项目时的依赖仓库配置如下:
pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral()gradlePluginPortal()}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()}
}
可以看到google()
和mavenCentral()
即可用在第三方库依赖的地方也可以用到插件的地方,这说明maven仓库即可上传普通的第三方库,也可以上传插件。而gradlePluginPortal()
仓库的名字,很明显它只用于存储插件。
可以在 mavenCentral()的后面添加如下代码打印出对应的仓库地址:
// 打印插件仓库地址
println("Plugin Repositories:")
repositories.forEach {println("- ${(it as? MavenArtifactRepository)?.url ?: it.name}")
}
同步一下gradle,可在Build面板看到打印的仓库地址,如下:
网上还有文章说google()
和mavenCentral()
的地址如下:
- https://maven.google.com/
- https://repo1.maven.org/maven2/
这和我打印的不一样,不知道是后面发生变化了,还是地址可以有多个?
这三个仓库的地址及阿里云镜像地址如下:
仓库别名 | 官方地址 | 阿里云镜像地址 |
---|---|---|
google() | https://dl.google.com/dl/android/maven2/ | https://maven.aliyun.com/repository/google |
mavenCentral() | https://repo.maven.apache.org/maven2/ | https://maven.aliyun.com/repository/public |
gradlePluginPortal() | https://plugins.gradle.org/m2 | https://maven.aliyun.com/repository/gradle-plugin |
完美的依赖配置
有了前面的知识后,修改Android的依赖仓库就比较简单了,如下:
pluginManagement {repositories {// google()仓库的的阿里云镜像替代maven {url = uri("https://maven.aliyun.com/repository/google")content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}// mavenCentral()仓库的阿里云镜像替代(同时包含jcenter()仓库)jmaven {url = uri("https://maven.aliyun.com/repository/public")}// gradlePluginPortal() 仓库的阿里云镜像替代maven {url = uri("https://maven.aliyun.com/repository/gradle-plugin")}// 备用官方仓库google { // android 官方插件content {// 下面表示仅过滤以下面这些包含开头的插件(估计Android官方插件都是以这些开头)// 依赖地址通常由 Group ID、Artifact ID 和 Version 三部分组成:groupId:artifactId:version// “\\.” 用于匹配符号 “.”,而 “.*” 用于匹配任何字符// 在DeepSeek问为什么要加这个规则,说是以前google()仓库还不成熟的时候,有些人为了加快访问,也会把Android官方插件上传到别的地方,比如jcenter,又或者是别人上传了相同但是修改过的非法插件,// 这入这个配置之后表示只能google()仓库下载这些插件,而且也表示google()仓库只提供这些开头的插件,如果也要从别的镜像下载的话,// 则别的镜像也要加入这个配置,这样就表示配置有的都可以下载,没配置有的则不行,找不到官方说法,不知道是不是这样的。有时间可以自己创建两个私服仓库,然后进行实验。includeGroupByRegex("com\\.android.*") // 匹配 com.android 开头的组includeGroupByRegex("com\\.google.*") // 匹配 com.google 开头的组includeGroupByRegex("androidx.*") // 匹配 androidx 开头的组}}mavenCentral() // 第三方插件gradlePluginPortal() // gradle插件以及第三方插件}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {// google()仓库的的阿里云镜像maven { url = uri("https://maven.aliyun.com/repository/google")}// mavenCentral()仓库的阿里云镜像(同时包含jcenter()仓库)jmaven {url = uri("https://maven.aliyun.com/repository/public")}// 备用官方仓库google() // Android官方依赖mavenCentral() // 第三方依赖}
}
注意配置仓库的顺序,当我们创建一个Android项目时,它默认的仓库顺序是这样的:google()
、mavenCentral()
、gradlePluginPortal()
,所以我们的镜像仓库也尽量保持这个顺序。
当我们同步一个Gradle项目的时候,可以查看到哪个依赖从哪个仓库中下载成功了,如下:
下载失败的也同样能看到,如下:
因为我们配置了多个仓库,所以在某个仓库下载失败了没关系,它还会尝试在别的仓库中去下载。在实际的使用中,我发现并不是这样的,一但某个请求超时了,则认Gradle认为是致命错误,直接停止整个工作,不再尝试后面别的仓库了, Gradle 将超时视为网络层不可用的严重错误,所以直接停止整个工作,这在使用聚合仓库时特别容易发生超时。有3个解决办法:
-
是看哪个仓库超时了,然后把后面的仓库往前放再重试。
-
在gradle.properties文件中加长超时时间或增加重试次数:
# 连接超时60秒,读取超时120秒 systemProp.http.connectionTimeout=60000 systemProp.http.readTimeout=120000 systemProp.org.gradle.internal.http.retry.max.attempts=3 # 重试3次
-
有些仓库组配置了多个仓库,如果这多个都找不到需要的资源,就会导致请求的时间更长,更容易触发超时,所以可以选择不使用仓库组,每个仓库都单独使用。
根据经常,我感觉使用第三个方式更好一点,在我的使用场景中,公司搭了Nexus私服,所以我把阿里云代理和官方都用Nexus代理一遍,以便依赖可以缓存到公司,加快访问,但是这时千万别用Group,它会很容易导致超时,然后就是整个构建都停止的,根本不会说某个仓库超时了再尝试别的仓库,我的项目使用示例如下:
fun RepositoryHandler.maven2(repoPath: String, includeGroups: Boolean = false) {maven {isAllowInsecureProtocol = trueurl = uri("http://192.168.1.251:8084/repository/$repoPath")if (includeGroups) {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}}
}pluginManagement {fun RepositoryHandler.maven2(repoPath: String, includeGroups: Boolean = false) {maven {isAllowInsecureProtocol = trueurl = uri("http://192.168.1.251:8084/repository/$repoPath")if (includeGroups) {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}}}repositories {maven2("android-google-aliyun-plugin/", true)// google()仓库的阿里云代理maven2("android-maven-central-plugin-aliyun/") // mavenCentral()仓库的阿里云代理maven2("android-gradle-plugin-portal-aliyun/") // gradlePluginPortal()仓库的阿里云代理maven2("android-google-plugin/", true) // google()仓库的本地代理maven2("android-maven-central-plugin/") // mavenCentral()仓库的本地代理maven2("android-gradle-plugin-portal/") // gradlePluginPortal()仓库的本地代理// 备用官方仓库google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral() // 第三方插件gradlePluginPortal() // gradle插件以及第三方插件}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {maven2("android-google-aliyun/") // google()仓库的阿里云代理maven2("android-maven-central-aliyun/") // mavenCentral()仓库的阿里云代理maven2("android-google/") // google()仓库的本地代理maven2("android-maven-central/") // mavenCentral()仓库的本地代理// 备用官方仓库google() // Android官方依赖mavenCentral() // 第三方依赖}
}rootProject.name = "DayDayUp"
include(":app")
这里为了简化仓库配置的重复代码创建了顶层函数maven2,但是我发现顶层函数只对dependencyResolutionManagement中的repositories 有用,对pluginManagement中的repositories不起作用,会报错,于是我把maven2函数在pluginManagement作用域中又声明了一次。这些仓库里面android-google-aliyun-plugin/
和android-google-aliyun/
是一样的,都是代理的同一个阿里云的地址,为什么要创建不同名字的两个仓库,这是为了区分报错时,通过url地址能知道它是在下载一个插件时出错的,还是下载 一个普通第三方库时出错的,因为插件的地址都带有plugin字符串。
gradlePluginPortal() 仓库介绍
gradlePluginPortal()
这是Gradle官方的仓库,专门用于托管 Gradle 官方gradle插件及第三方的gradle插件,比如:
- 官方插件(如 org.jetbrains.kotlin.android)
- 社区插件(如 com.github.spotbugs、io.spring.dependency-management)
gradle的官方插件通常不会托管到mavenCentral()
或google()
。
mavenCentral() 仓库介绍
包含几乎所有 非 google() 系的 Java 库(当然也包含kotlin)。
google() 仓库介绍
仅包含 Google 官方发布的库。Google 的 Android 相关库不在 Maven 中央仓库发布,而是托管在独立的 maven.google.com,即google()仓库。官方Android库比如:
- Android SDK 组件(如 `com.android.tools.build:gradle`)
- Material Design 库(如 `com.google.android.material:material`)
- Firebase 服务(如 `com.google.firebase:firebase-auth`)
- Play 服务(如 `com.google.android.gms:play-services-maps`)
jitpack 仓库介绍
另外还有仓库也是经常能看到:https://jitpack.io
,遗憾的是阿里云并未提供此仓库的镜像,DeepSeek对该仓库的介绍:
JitPack
是一个托管 GitHub
/GitLab
开源项目 的 Maven 仓库,允许开发者直接通过 Git 仓库地址引用依赖,例如:
implementation 'com.github.用户名:仓库名:版本号'
典型场景:
- 引用 GitHub 上的个人或小型开源项目。
- 快速测试未发布到 Maven Central 的库。
为什么阿里云不镜像 JitPack?
- 技术挑战:JitPack 的构建是动态的(基于 Git 提交),传统镜像工具无法实时同步。
- 版权风险:JitPack 上的库版权归属复杂,直接镜像可能引发法律问题。
- 使用频率:相比 Maven Central,JitPack 的使用场景较为小众。
对于JitPack 仓库,依赖下载时会走国内 CDN,实际速度可能较快,这取决于网络,如果发现下载慢的话,可以使用私服仓库缓存起来,或者缓存到mavenLocal()
仓库。
mavenLocal()仓库介绍
mavenLocal()
是 Gradle
和 Maven
构建工具中的一个特殊仓库配置,用于从本地 Maven
缓存目录(通常位于 ~/.m2/repository
)中查找依赖。它的核心作用是让开发者能够优先使用本地已安装或手动发布的库,而非从远程仓库下载。
gradle
默认并不会把从google()
、mavenCentral()
等下载到的依赖缓存到mavenLocal()
仓库(~/.m2/repository
),对于如何把这些仓库下载的依赖安装到mavenLocal()
可以问DeepSeek,我懒得写这么多了。
注意事项
- 慎用优先级:
若将 mavenLocal() 放在第一位,可能意外使用到本地过时或测试中的依赖,导致构建不一致。建议仅在调试时启用。
- 清理缓存:
本地仓库可能积累大量无用依赖,定期清理(删除 ~/.m2/repository 中的旧文件)可节省空间。
- 团队协作问题:
本地仓库的内容不会同步给其他开发者,团队项目中避免依赖 mavenLocal() 中的库。
一些别人的参考文章
- https://blog.csdn.net/m0_67392661/article/details/124131843 这里面有介绍到一个Maven-Search插件使用,据说搜索插件非常快。
- https://www.cnblogs.com/chensheng0617/p/18307141