Gradle不支持为不同依赖指定不同仓库,依赖解析按repositories声明顺序扁平查找;需将目标仓库置首、禁用或前置mavenLocal()、精确配置私有仓库URL及认证,并避免其他仓库提供冲突构件。

Gradle 本身不支持「强制某个依赖只从某仓库下载」的语法,repositories 块是全局作用域的,所有依赖都按顺序查仓库。但你可以通过组合策略实现等效效果:控制仓库顺序 + 排除干扰源 + 利用 mavenLocal() 的前置性。
为什么不能直接指定「这个依赖走 A 仓库,那个走 B」
Gradle 的依赖解析是扁平的:它拿到一个坐标(如 com.squareup.okhttp3:okhttp:4.12.0),就从 repositories 列表第一个开始找,找到就停,不会为不同依赖切换仓库。你写十个 implementation,它们共享同一套仓库查找链。
所以所谓「限制某个依赖只从指定仓库获取」,本质是让 Gradle 在搜到它之前,**别在别的仓库里提前命中同名但版本/内容不对的构件**——尤其是避免被公司私有仓库或本地 .m2 里旧版污染。
把目标仓库放在 repositories 最前面
这是最直接、最常被忽略的生效点。Gradle 查找依赖时严格按声明顺序,一旦在某个仓库命中,就不再往后查。
- 如果你只想让
com.example:internal-sdk:2.1.0从公司 Nexus 获取,就把公司仓库写在最前:repositories { maven { url "https://nexus.example.com/repository/internal/" } google() mavenCentral() } - 如果这个 SDK 同时在 Maven Central 有同名但不同内容的旧版(比如误传的快照版),把它放后面就可能被错误拉取。
-
mavenLocal()默认指向~/.m2/repository,它行为特殊:只要启用,就会自动插在所有远程仓库之前。所以如果你不希望本地.m2干扰,就别写mavenLocal();如果想让它优先,就明确写在第一位。
排除其他仓库中可能冲突的坐标
即使你把目标仓库放第一,也不能保证它一定有你要的版本。如果它没找到,Gradle 会继续往后查——这时候就要防止它从别的仓库「捡漏」到不该用的包。
- 对明确不想走远程仓库的依赖,用
exclude不够,得用resolutionStrategy强制拒绝: - 在
configurations.all或具体 configuration(如implementation)里加:
configurations.all {
resolutionStrategy {
force 'com.example:internal-sdk:2.1.0'
// 或更激进地:禁止从特定仓库解析某些 group
failOnVersionConflict()
}
}
但这只是版本锁定,不是源头控制。真正管用的是配合仓库顺序 + 私有仓库的精确路径管理(比如 Nexus 上只部署内部 SDK,不镜像外部库)。
用 maven { url } + credentials 隔离私有源
很多团队把内部 SDK 放在带鉴权的私有 Maven 仓库里。这时除了顺序,还要确保该仓库能访问、且不被其他无权限仓库「绕过」。
- 显式声明带认证的仓库,并放在首位:
repositories { maven { url "https://nexus.example.com/repository/internal/" credentials { username = project.findProperty("nexusUsername") ?: System.getenv("NEXUS_USER") password = project.findProperty("nexusPassword") ?: System.getenv("NEXUS_PASS") } } mavenCentral() }- 这样即使 Maven Central 里有同名 artifact,Gradle 也会先去你的 Nexus 查;而由于 Nexus 没配代理或只代理特定 group,它根本不会返回外部库,自然杜绝了误拉。
- 关键点:私有仓库的
url必须精确到 repository path 级别(比如/repository/internal/),而不是整个 Nexus 根地址(/),否则可能意外命中其他 repo 的 artifact。
最容易被忽略的是仓库 URL 的末尾斜杠和 repository path 的对应关系——少一个 / 或多一层路径,Gradle 就可能 404 然后默默 fallback 到下一个仓库,导致你以为“限制了”,其实根本没生效。










