求助:Gradle未从Maven Central下载依赖,仅访问私有Nexus仓库
我碰到过很多开发者遇到这种Gradle仓库优先级搞混的问题,结合你描述的场景(本地代理例外可行,其他场景出问题),给你梳理几个关键排查和解决方向:
1. 检查Gradle仓库的声明顺序
Gradle是按声明顺序查找依赖的,如果你的Nexus仓库配置写在了mavenCentral()前面,Gradle就会优先去Nexus查找,找不到就直接报错(不会自动 fallback 到其他仓库)。
修复方式:
确保在项目的build.gradle(或build.gradle.kts)里,把mavenCentral()放在Nexus仓库前面:
Groovy DSL示例:
repositories { mavenCentral() // 优先声明Maven Central maven { url "http://your-nexus-url/repository/maven-public/" credentials { username = nexusUsername password = nexusPassword } } }
Kotlin DSL示例:
repositories { mavenCentral() maven { url = uri("http://your-nexus-url/repository/maven-public/") credentials { username = nexusUsername password = nexusPassword } } }
另外别忘了检查全局Gradle配置(~/.gradle/init.gradle或~/.gradle/init.gradle.kts),很多公司会在这里统一配置仓库,如果全局配置里把Nexus设为优先,会覆盖项目级的配置。
2. 排查Nexus的代理仓库配置
如果你们的Nexus是作为Maven Central的代理使用,那得确保Nexus的代理功能正常:
- 登录Nexus后台,进入Repositories,找到你的Maven Central代理仓库(通常叫
maven-central):- 检查Remote Storage是否为
https://repo1.maven.org/maven2/,且Status显示Online; - 检查组仓库(比如
maven-public)的Member Repositories列表里,是否包含这个代理仓库,且顺序合理(代理仓库靠前的话,Nexus内部会优先从代理拉取)。
如果Nexus的代理配置失效,Gradle去Nexus找不到依赖就会直接报错,不会再去Maven Central尝试。
- 检查Remote Storage是否为
3. 统一代理配置的场景差异
你本地通过设置代理例外可以正常访问,但其他场景(CI/CD、同事机器)出问题,核心是代理配置的环境差异:
- 本地的
~/.gradle/gradle.properties里,你可能设置了systemProp.http.nonProxyHosts,把repo1.maven.org和Nexus域名加入了例外,让Gradle直接访问这些地址; - 但其他环境可能没有这个配置,或者代理规则不同:比如CI服务器有全局代理,导致Gradle无法直接访问Maven Central,只能走Nexus,而Nexus又没代理到Maven Central,就会报错。
解决建议:
在项目的gradle.properties里统一配置代理规则(如果需要),或者在CI环境的构建脚本中添加非代理主机配置:
systemProp.http.proxyHost=your-proxy-host systemProp.http.proxyPort=your-proxy-port systemProp.http.nonProxyHosts=repo1.maven.org|your-nexus-domain.com|localhost|127.0.0.1
4. 精确控制依赖的仓库来源
如果上面的方法都没解决,可以用Gradle的content块精确指定哪些依赖走哪个仓库,避免Gradle乱找:
Groovy DSL示例:
repositories { mavenCentral { content { // 所有公共第三方依赖(比如com.、org.开头的组)优先走Maven Central includeGroupByRegex("com\\..*") includeGroupByRegex("org\\..*") } } maven { url "http://your-nexus-url/repository/maven-public/" credentials { username = nexusUsername password = nexusPassword } content { // 只有公司内部的私有依赖走Nexus includeGroup("your.company.group") } } }
这种方式能从根源上避免仓库优先级的问题,让不同类型的依赖明确走对应的仓库。
5. 清理Gradle缓存
有时候缓存里的错误记录会导致Gradle重复尝试错误的仓库,执行以下命令清理缓存,然后重新同步项目:
./gradlew cleanBuildCache
或者手动删除本地Gradle缓存目录:~/.gradle/caches,再重新构建。
内容的提问来源于stack exchange,提问作者Brandon

