Gradle多仓库配置失效:为何无法从gradlePluginPortal拉取缺失依赖?
Gradle 不从 gradlePluginPortal 拉取缺失依赖的原因及解决办法
这事儿的核心在于Gradle 依赖解析的“元数据优先”策略,我给你拆解下:
问题根源
当你同时配置了阿里云的 gradle-plugin 仓库和官方的 gradlePluginPortal() 时,Gradle 会按照你写的仓库顺序依次查找依赖的元数据(比如 POM 文件或 Gradle 插件描述符):
- 首先检查阿里云仓库,它里面刚好有
dokka-gradle-plugin:1.5.0的元数据(比如 POM),但缺失对应的 JAR 包和依赖的dokka-core:1.5.0构件。 - Gradle 一旦在某个仓库找到依赖的元数据,就会认定这个仓库是该依赖的“来源仓库”,后续只会尝试从这个仓库下载该依赖及其所有关联构件——哪怕某些构件下载失败,也不会再去后面的仓库(也就是
gradlePluginPortal())重试。
而当你只保留 gradlePluginPortal() 时,官方仓库里有完整的元数据和所有需要的 JAR 包,所以解析完全正常。
解决办法
针对这个问题,有几个可行的处理方式:
1. 调整仓库顺序,优先使用官方仓库
把 gradlePluginPortal() 放在阿里云仓库前面,这样 Gradle 会先去官方仓库找元数据,找到完整的依赖信息后就不会再去阿里云仓库尝试了:
repositories { gradlePluginPortal() maven { url "https://maven.aliyun.com/repository/gradle-plugin" } }
这种方式简单直接,但如果你的项目里有其他依赖更适合从阿里云下载,可能会损失镜像加速的优势。
2. 给阿里云仓库添加内容过滤,只处理特定依赖
通过 content 配置让阿里云仓库只负责你指定的依赖/插件,其他依赖自动走官方仓库,这样既能保留阿里云的加速,又不会影响 dokka 这类官方插件的解析:
repositories { maven { url "https://maven.aliyun.com/repository/gradle-plugin" content { // 只让阿里云处理特定组的依赖,比如阿里云自己的插件 includeGroupByRegex("com\\.aliyun.*") // 也可以添加其他你确认阿里云有的插件组 // includeGroup("org.some.other.group") } } gradlePluginPortal() }
3. 确认阿里云仓库是否有对应版本的 dokka 构件
如果一定要优先用阿里云,你可以去阿里云 Maven 仓库搜索下有没有 dokka-core:1.5.0,或者尝试升级 dokka 版本到阿里云已收录的版本,这样就能从阿里云完整下载依赖了。
内容的提问来源于stack exchange,提问作者FredSuvn
相关产品推荐
相关产品推荐

