要让 Maven 项目真正使用 Nexus 私服,必须在 pom.xml 或 settings.xml 中显式配置镜像或仓库,确保 ID、URL 与 Nexus 代理仓库(如 maven-central)完全一致,并正确设置部署策略、权限及认证信息。

怎么让 Maven 项目真正用上 Nexus 私服
默认情况下,Maven 根本不走 Nexus,它只认 https://repo.maven.apache.org/maven2/。想让它走私服,必须显式重写仓库地址——不是靠改 settings.xml 就完事,关键在项目级的 pom.xml 或全局 settings.xml 的 <mirrors></mirrors> 配置。
- 最稳妥的方式是配置
<mirror></mirror>:把所有中央仓请求(central)强制代理到 Nexus,比如<mirrorof>central</mirrorof> - 别只改
~/.m2/settings.xml就以为万事大吉——CI 环境、IDE 内置 Maven、Docker 构建都可能用自己的一套settings.xml,得确认实际生效的是哪一份 - 如果项目里硬编码了
<repository></repository>(比如指向 JCenter),<mirror></mirror>会失效;这时要么删掉项目里的仓库声明,要么把 Nexus 地址直接写进<repository></repository> - Nexus 默认的 proxy 仓库叫
maven-central,URL 是http://nexus-host:8081/repository/maven-central/,镜像配置里<url></url>必须和这个完全一致,少个斜杠或大小写错误都会 404
为什么 Nexus 上找不到你刚 deploy 的 jar
常见错觉:执行了 mvn deploy 就等于“上传成功”。其实 Nexus 有两道关卡:一是部署目标仓库是否允许部署(Deployment Policy),二是你的 Maven 账号有没有对应仓库的 nx-repository-view-maven2-*:add 权限。
- 检查 Nexus 管理界面:进入目标仓库(如
maven-releases)→ “Configuration” → “Deployment policy” 必须是Allow redeploy(快照)或Disable redeploy(发布版),不能是Read only -
settings.xml里的<server></server>块必须和pom.xml中<distributionmanagement><repository><id></id></repository></distributionmanagement>完全匹配,ID 大小写敏感 - 快照版本(含
-SNAPSHOT)只能部署到maven-snapshots类型仓库;发布版本必须走maven-releases,且该仓库的Version policy得设为Release - 执行
mvn deploy -X看真实 HTTP 请求路径——如果 URL 末尾是/maven2/而不是/repository/maven-releases/,说明repository.id没对上,Nexus 拒绝路由
如何避免团队成员本地 settings.xml 配置不一致
靠人手动维护 settings.xml 必然出岔子。正确做法是把 Nexus 配置做成可分发的标准化文件,再通过构建工具或脚本注入。
- 把 Nexus 镜像配置抽成独立 XML 片段(比如
nexus-mirror.xml),用 CI 流水线在构建前自动合并进settings.xml - Maven 3.6.3+ 支持
--settings参数指定路径,CI 脚本里统一用mvn --settings ./ci-settings.xml compile,绕过用户本地文件 - IDEA 用户容易忽略:即使设置了 Maven home,IDEA 默认仍用内置嵌入式 Maven,它的
settings.xml路径在Help → Edit Custom VM Options附近,得单独配 - 如果用了 Spring Boot 的
spring-boot-starter-parent,它内部声明了central仓库,会覆盖<mirror></mirror>——此时必须在项目pom.xml里加<repositories><repository><id>central</id><url>https://repo1.maven.org/maven2/</url></repository></repositories>显式覆盖,否则依赖解析失败
HTTP 302 / 401 错误背后的真实原因
看到 Failed to transfer file: http://nexus/... Return code is: 302 或 401 Unauthorized,别急着查密码,先看 Nexus 日志和请求路径。
立即学习“Java免费学习笔记(深入)”;
-
302通常是 Nexus 启用了匿名访问限制,但客户端没带认证头——检查 Nexus 的 “Anonymous Access” 是否关闭,以及settings.xml中<server><username></username></server>是否填了 Nexus 界面创建的账号(不是系统账号) -
401不一定密码错:可能是账号没分配nx-repository-view-maven2-maven-releases:read权限,或者仓库类型是hosted却尝试从proxy仓库拉取 - Nexus 默认监听
http://localhost:8081,但很多公司反向代理后实际访问的是https://nexus.company.com——此时settings.xml的<url></url>必须用后者,否则认证头被代理截断 - 用
curl -v -u user:pass "https://nexus.company.com/repository/maven-releases/com/example/foo/1.0/foo-1.0.pom"手动测试,比看 Maven 日志更快定位是网络、权限还是路径问题
最常被跳过的环节是验证 Nexus 仓库的 “Browse” 页面能否直接打开 jar 下载链接——连浏览器都 404,Maven 肯定也拉不到。别在 CI 报错后才回头查,部署完立刻手点一个已知存在的坐标试试。











