阿里云云效 Maven

阿里云云效 Maven

官网:https://developer.aliyun.com/mvn/guide

阿里云Maven中央仓库为 阿里云云效 提供的公共代理仓库,帮助研发人员提高研发生产效率,使用阿里云Maven中央仓库作为下载源,速度更快更稳定。

阿里云云效 是企业级一站式 DevOps 平台,覆盖产品从需求到运营的研发全生命周期,其中云效也提供了免费、可靠的Maven私有仓库 Packages 和代码管理仓库 Codeup,欢迎您体验使用。

云效制品仓库 Packages 致力于帮助开发者统一管理各种开发语言在开发、构建过程中的依赖,构建成果(二进制制品)以及交付过程关键信息的重要组件。

云效代码管理 Codeup 是阿里云出品的一款企业级代码管理平台,提供代码托管、代码评审、代码扫描、代码度量等功能,不限人数、超大容量且免费使用,全方位保护代码资产,帮助团队实现安全、稳定、高效的研发管理。

仓库名称阿里云仓库地址阿里云仓库地址(老版)源地址
centralhttps://maven.aliyun.com/repository/centralhttps://maven.aliyun.com/nexus/content/repositories/centralhttps://repo1.maven.org/maven2/
publichttps://maven.aliyun.com/repository/publichttps://maven.aliyun.com/nexus/content/groups/publiccentral仓和jcenter仓的聚合仓
gradle-pluginhttps://maven.aliyun.com/repository/gradle-pluginhttps://maven.aliyun.com/nexus/content/repositories/gradle-pluginhttps://plugins.gradle.org/m2/
apache snapshotshttps://maven.aliyun.com/repository/apache-snapshotshttps://maven.aliyun.com/nexus/content/repositories/apache-snapshotshttps://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仓库其实是一个组,把多个仓库组合起来,它把jcentercentral组合到一起。

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/m2https://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()仓库)j
        maven {
            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()仓库)j
        maven {
            url = uri("https://maven.aliyun.com/repository/public")
        }

        // 备用官方仓库
        google()       // Android官方依赖
        mavenCentral() // 第三方依赖
    }
}

注意配置仓库的顺序,当我们创建一个Android项目时,它默认的仓库顺序是这样的:google()mavenCentral()gradlePluginPortal(),所以我们的镜像仓库也尽量保持这个顺序。

当我们同步一个Gradle项目的时候,可以查看到哪个依赖从哪个仓库中下载成功了,如下:
在这里插入图片描述
下载失败的也同样能看到,如下:
在这里插入图片描述
因为我们配置了多个仓库,所以在某个仓库下载失败了没关系,它还会尝试在别的仓库中去下载。在实际的使用中,我发现并不是这样的,一但某个请求超时了,则认Gradle认为是致命错误,直接停止整个工作,不再尝试后面别的仓库了, Gradle 将超时视为网络层不可用的严重错误,所以直接停止整个工作,这在使用聚合仓库时特别容易发生超时。有3个解决办法:

  1. 是看哪个仓库超时了,然后把后面的仓库往前放再重试。

  2. 在gradle.properties文件中加长超时时间或增加重试次数:

    # 连接超时60秒,读取超时120秒
    systemProp.http.connectionTimeout=60000
    systemProp.http.readTimeout=120000
    systemProp.org.gradle.internal.http.retry.max.attempts=3  # 重试3
  3. 有些仓库组配置了多个仓库,如果这多个都找不到需要的资源,就会导致请求的时间更长,更容易触发超时,所以可以选择不使用仓库组,每个仓库都单独使用。

根据经常,我感觉使用第三个方式更好一点,在我的使用场景中,公司搭了Nexus私服,所以我把阿里云代理和官方都用Nexus代理一遍,以便依赖可以缓存到公司,加快访问,但是这时千万别用Group,它会很容易导致超时,然后就是整个构建都停止的,根本不会说某个仓库超时了再尝试别的仓库,我的项目使用示例如下:

fun RepositoryHandler.maven2(repoPath: String, includeGroups: Boolean = false) {
    maven {
        isAllowInsecureProtocol = true
        url = 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 = true
            url = 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()GradleMaven 构建工具中的一个特殊仓库配置,用于从本地 Maven 缓存目录(通常位于 ~/.m2/repository)中查找依赖。它的核心作用是让开发者能够优先使用本地已安装或手动发布的库,而非从远程仓库下载。

gradle默认并不会把从google()mavenCentral()等下载到的依赖缓存到mavenLocal()仓库(~/.m2/repository),对于如何把这些仓库下载的依赖安装到mavenLocal()可以问DeepSeek,我懒得写这么多了。

注意事项

  • 慎用优先级:
    若将 mavenLocal() 放在第一位,可能意外使用到本地过时或测试中的依赖,导致构建不一致。建议仅在调试时启用。
  • 清理缓存:
    本地仓库可能积累大量无用依赖,定期清理(删除 ~/.m2/repository 中的旧文件)可节省空间。
  • 团队协作问题:
    本地仓库的内容不会同步给其他开发者,团队项目中避免依赖 mavenLocal() 中的库。

一些别人的参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

android_cai_niao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值