阿里云云效 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