← 返回题目列表

Maven 的仓库有哪几种?私服(Nexus)是干什么的?

中等 第 23 / 23 题 更新于 2026/07/28
Maven仓库Nexus私服依赖管理

简化版

**Maven 的仓库(Repository)分三层:① 本地仓库(Local)——你电脑上的 ~/.m2/repository,缓存下载过的依赖,构建时先从这里找;② 远程/中央仓库(Central/Remote)——公网上的公共仓库(Maven Central、repo.maven.apache.org),本地没有就从这里下载;③ 私服(Private/Nexus/Artifactory)——公司自己搭的仓库服务器,作为「中央仓库的代理 + 公司内部制品的仓库」。**依赖查找顺序:先本地仓库 → 没有再去远程仓库(配了私服就走私服)下载 → 下载后缓存到本地私服(Nexus/Artifactory)的作用① 代理缓存(公司所有人的依赖下载都走私服,私服帮你缓存中央仓库的包,第二个人要同一个包直接从私服拿,快、省外网流量);② 托管内部制品(公司自己开发的 jar 不能传到公网,发布到私服的 hosted 仓库,供内部项目依赖);③ 仓库组(group)(把「代理中央仓库 + 内部 hosted 仓库」聚合成一个地址,项目只配一个私服地址就都能拿到);④ 权限/审计/统一管控(控制谁能发布、用哪些依赖,安全合规)。核心记忆:三层仓库(本地缓存 → 远程公网 → 私服),先本地后远程;私服是公司内的中央仓库代理 + 内部制品仓库,作用是加速、省流量、托管内部包、统一管控。

详细版

三层仓库

仓库位置作用
本地仓库~/.m2/repository缓存下载过的依赖,构建先从这找
中央仓库repo.maven.apache.org公网公共仓库,本地没有从这下
私服公司搭的 Nexus/Artifactory中央仓库代理 + 内部制品仓库

依赖查找顺序:本地仓库 → (配了 mirror/私服则走私服)远程仓库 → 下载后缓存本地。

<!-- settings.xml:配置私服作为镜像(所有请求都走私服)-->
<mirrors>
  <mirror>
    <id>nexus</id>
    <mirrorOf>*</mirrorOf>   <!-- 拦截所有仓库请求,都走私服 -->
    <url>http://nexus.company.com/repository/maven-public/</url>
  </mirror>
</mirrors>

<!-- 发布到私服(pom.xml)-->
<distributionManagement>
  <repository>   <!-- release 版发布地址 -->
    <id>nexus-releases</id>
    <url>http://nexus.company.com/repository/maven-releases/</url>
  </repository>
  <snapshotRepository>   <!-- snapshot 版发布地址 -->
    <id>nexus-snapshots</id>
    <url>http://nexus.company.com/repository/maven-snapshots/</url>
  </snapshotRepository>
</distributionManagement>

Nexus 的仓库类型

  • hosted(宿主):存公司自己的制品(maven-releases、maven-snapshots)。
  • proxy(代理):代理外部仓库(maven-central,缓存中央仓库的包)。
  • group(仓库组):聚合多个仓库成一个地址(maven-public = 代理 + hosted,项目只配这一个)。

⚠️ 私服的核心价值可以一句话概括:「让公司只有私服一个出口去公网拉依赖,同时让内部的包有地方发布」——它既是「对外的缓存代理」又是「对内的制品仓库」。想象一个 50 人的团队,如果每个人的每次构建都直接去 Maven Central 下载:① 同一个 spring-core 被下载 50 遍(浪费外网带宽)、② 外网慢或中央仓库抽风时全员构建失败、③ 公司自己写的公共库没地方放(不能传公网)。私服解决这三件事:① proxy 仓库代理并缓存中央仓库,第一个人下过之后其他人从私服拿(快、省流量);② 私服高可用,不受外网波动影响;③ hosted 仓库存公司内部制品,团队间共享依赖。再用 group 仓库把 proxy 和 hosted 聚合成一个 URL,项目里只配这一个地址,Maven 会在组内按顺序找(先找 hosted 内部包、再找 proxy 外部包)。

完整版教学

一、三层仓库

先理解 Maven 的三层仓库:

Maven 的三层仓库:

① 本地仓库(Local Repository):
   位置:~/.m2/repository(你电脑上)
   作用:缓存所有下载过的依赖
   → 构建时先从本地找(有就直接用,不用下载)
   → 下载过的依赖都存这里(第二次构建不用再下)

② 中央/远程仓库(Central/Remote Repository):
   位置:repo.maven.apache.org(Maven Central,公网)
   作用:公共的依赖仓库(几乎所有开源库都在这)
   → 本地没有的依赖,从这里下载

③ 私服(Private Repository):
   位置:公司自己搭的服务器(Nexus/Artifactory)
   作用:中央仓库的代理 + 公司内部制品的仓库
   → 公司项目配私服,依赖走私服(不直接连公网中央仓库)

三层的关系:
  本地(缓存)← 私服(公司内代理+内部包)← 中央(公网源头)
  找依赖:本地 → 私服 → 中央(层层回源)

所以三层仓库:本地(电脑缓存)/中央(公网公共)/私服(公司代理+内部)

Maven 的三层仓库① 本地仓库(~/.m2/repository,缓存下载过的依赖、构建先从本地找)、② 中央/远程仓库(repo.maven.apache.org Maven Central,公网公共仓库、本地没有从这下)、③ 私服(公司搭的 Nexus/Artifactory,中央仓库代理 + 内部制品仓库)。三层关系:本地(缓存)← 私服(公司内代理+内部包)← 中央(公网源头),找依赖层层回源。理解「三层仓库:①本地(~/.m2/repository 电脑缓存,先从这找)②中央(repo.maven.apache.org 公网公共,本地没有从这下)③私服(公司 Nexus/Artifactory,代理+内部制品);关系本地←私服←中央,找依赖层层回源」,就理解了三层仓库。

二、依赖查找顺序

理解依赖的查找和下载流程:

依赖查找/下载流程:

构建时要一个依赖(如 spring-core:6.0):
① 先查本地仓库(~/.m2/repository)
   有 → 直接用(不下载)
   没有 → 下一步
② 去远程仓库下载(配了私服/镜像则走私服)
   配私服:向私服要 → 私服有(缓存过)直接给
                   → 私服没有,私服去中央仓库下,缓存后给你
   没配私服:直接去中央仓库下
③ 下载的依赖存入本地仓库(下次直接用)

关键:本地仓库是"缓存"
  → 下过一次就存本地,之后构建不用再下(快)
  → 换电脑/清空 .m2 才要重新下

强制更新:
  mvn -U:强制检查更新(snapshot 或缺失的依赖重新拉)
  离线:mvn -o(只用本地,不连网)

镜像(mirror):
  settings.xml 里 <mirror><mirrorOf>*</mirrorOf>
  → 拦截所有仓库请求,都走私服(改一处,全局走私服)

所以查找顺序:本地→远程(配私服走私服)→缓存到本地

依赖查找/下载流程:要一个依赖时——① 先查本地仓库(有直接用、没有下一步);② 去远程仓库下载(配了私服走私服:私服有缓存直接给、没有私服去中央仓库下并缓存;没配私服直接去中央仓库);③ 下载的依赖存入本地仓库(下次直接用)。关键:本地仓库是缓存(下过一次存本地、之后不用再下)。强制更新:mvn -U(强制检查更新)、mvn -o(离线只用本地)。镜像:settings.xml <mirrorOf>*</mirrorOf> 拦截所有请求走私服。理解「查找顺序:①先查本地(有直接用)②去远程(配私服走私服,私服有缓存直接给、没有回源中央)③缓存到本地;本地仓库是缓存(下过存本地不再下);mvn -U 强制更新、-o 离线;mirror *拦截所有走私服」,就掌握了依赖查找顺序。

三、私服的作用

理解私服(Nexus/Artifactory)解决什么问题:

私服(Nexus/Artifactory)解决的问题:

场景:50 人团队,都直接连 Maven Central:
  ✗ 同一个包被下载 50 遍(浪费外网带宽)
  ✗ 外网慢/中央仓库抽风 → 全员构建失败
  ✗ 公司自己写的公共库没地方放(不能传公网)

私服解决这三件事:
① 代理缓存(proxy):
   公司所有人的下载都走私服
   → 私服代理中央仓库,第一个人下过后缓存
   → 其他人从私服拿(快、省外网流量)

② 高可用/稳定:
   私服在公司内网,不受外网波动影响
   → 构建更稳定(不依赖外网每次都通)

③ 托管内部制品(hosted):
   公司自己开发的 jar 发布到私服
   → 团队间共享内部库(不用传公网)

④ 统一管控:
   - 控制用哪些依赖(安全/合规,禁用有漏洞的包)
   - 控制谁能发布
   - 审计(谁用了什么)

一句话概括私服价值:
  "让公司只有一个出口去公网拉依赖(代理缓存)
   + 让内部的包有地方发布(内部仓库)"
  → 对外缓存代理 + 对内制品仓库

所以私服:代理缓存(快省流量)+高可用+托管内部制品+统一管控

私服(Nexus/Artifactory)解决的问题(以 50 人团队都连 Central 为例):同一包下 50 遍浪费带宽、外网抽风全员构建失败、内部库没地方放。私服解决:① 代理缓存(proxy,下载走私服、第一个人下过后缓存、其他人从私服拿快省流量)、② 高可用/稳定(私服在内网不受外网波动)、③ 托管内部制品(hosted,内部 jar 发私服、团队共享不传公网)、④ 统一管控(控制用哪些依赖/谁能发布/审计)。一句话价值:对外缓存代理 + 对内制品仓库。理解「私服解决:同包下多遍浪费带宽+外网抽风全员失败+内部库没处放;①代理缓存(proxy 快省流量)②高可用(内网稳定)③托管内部制品(hosted 团队共享)④统一管控(依赖/发布/审计);价值=对外缓存代理+对内制品仓库」,就掌握了私服的作用。

四、Nexus 的仓库类型

理解 Nexus 里的三种仓库类型:

Nexus 的仓库类型:

① hosted(宿主仓库):存公司自己的制品
   maven-releases:存正式版(release)
   maven-snapshots:存快照版(snapshot,开发中)
   → 公司内部的 jar 发布到这里

② proxy(代理仓库):代理外部仓库
   maven-central:代理 Maven Central
   → 缓存从中央仓库下的包(第一个人下、之后从缓存)
   → 也可代理其他外部仓库(jcenter、spring 等)

③ group(仓库组):聚合多个仓库成一个地址
   maven-public = maven-releases + maven-snapshots + maven-central
   → 项目只配这一个地址,Nexus 按组内顺序找:
     先找 hosted(内部包)→ 再找 proxy(外部包)
   → 简化配置(一个 URL 搞定所有依赖来源)

配置对应:
  拉依赖(settings.xml mirror):指向 group(maven-public)
    → 一个地址,内部外部都能拿
  发布(pom distributionManagement):指向 hosted
    → release 版发 maven-releases、snapshot 发 maven-snapshots

为什么分类型:
  hosted 存、proxy 缓存外部、group 聚合方便使用
  → 职责清晰、配置简单

所以 Nexus:hosted(存内部)/proxy(代理外部)/group(聚合成一个地址)

Nexus 的三种仓库类型① hosted(宿主,存公司自己的制品,maven-releases 正式版/maven-snapshots 快照版)、② proxy(代理外部仓库,maven-central 代理中央仓库并缓存)、③ group(仓库组,聚合多个仓库成一个地址 maven-public,项目只配这一个、Nexus 按组内顺序找:先 hosted 内部包再 proxy 外部包)。配置对应:拉依赖(mirror)指向 group、发布(distributionManagement)指向 hosted(release 发 releases、snapshot 发 snapshots)。理解「Nexus 仓库类型:①hosted(存内部制品,releases/snapshots)②proxy(代理外部并缓存,maven-central)③group(聚合成一个地址 maven-public,先找 hosted 再 proxy);拉依赖 mirror 指 group、发布 distributionManagement 指 hosted」,就掌握了 Nexus 的仓库类型。

五、发布制品到私服

理解怎么把制品发布到私服:

发布制品到私服:

① pom.xml 配置发布地址(distributionManagement):
   <distributionManagement>
     <repository><id>nexus-releases</id>
       <url>.../maven-releases/</url></repository>
     <snapshotRepository><id>nexus-snapshots</id>
       <url>.../maven-snapshots/</url></snapshotRepository>
   </distributionManagement>

② settings.xml 配置认证(发布要账号密码):
   <servers><server>
     <id>nexus-releases</id>   ← id 要和上面对应
     <username>...</username><password>...</password>
   </server></servers>

③ 执行发布:
   mvn deploy
   → Maven 根据版本号选仓库:
     版本带 -SNAPSHOT(如 1.0-SNAPSHOT)→ 发 snapshotRepository
     正式版(如 1.0)→ 发 repository(releases)

release vs snapshot 发布的区别:
  snapshot:可重复发布(同版本号可覆盖,开发中频繁发)
  release:一般不可覆盖(正式版,发了就固定,见 semver 题)

install vs deploy:
  mvn install:装到"本地仓库"(只本机可用)
  mvn deploy:发到"远程私服"(团队可用)

所以发布:配 distributionManagement+servers 认证,mvn deploy(按版本选仓库)

发布制品到私服① pom.xml 配 <distributionManagement>(发布地址,repository 正式版/snapshotRepository 快照版)、② settings.xml 配 <servers> 认证(账号密码、id 对应)、③ 执行 mvn deploy(按版本号选仓库:带 -SNAPSHOT 发 snapshotRepository、正式版发 repository)。release vs snapshot 发布:snapshot 可重复发布(同版本可覆盖、开发中频繁发)、release 一般不可覆盖(正式版固定)。install vs deploy:mvn install 装本地仓库(只本机)、mvn deploy 发远程私服(团队可用)。理解「发布:①pom 配 distributionManagement 地址②settings 配 servers 认证③mvn deploy 按版本选仓库(带 -SNAPSHOT 发 snapshots、正式版发 releases);snapshot 可覆盖、release 不可;install 装本地、deploy 发私服」,就掌握了发布制品。

六、实践与总结

总结 Maven 仓库和私服的实践:

实践建议:
  ① 团队用私服(Nexus/Artifactory)
     - settings.xml 配 mirror 指向 group(maven-public)
     - 所有依赖走私服(快、省流量、稳定、可管控)
  ② 内部库发布到私服 hosted
     - release 版发 maven-releases、snapshot 发 maven-snapshots
  ③ 认证放 settings.xml 的 servers(别放 pom,避免泄露)
  ④ 本地仓库损坏(下载中断)→ 删对应目录重下,或 mvn -U

常见问题:
  ① 依赖下不下来 → 检查 mirror/私服地址、网络
  ② snapshot 不更新 → mvn -U 强制更新
  ③ 发布 401 → 检查 settings.xml servers 的认证和 id 对应
  ④ 本地有损坏的 jar(.lastUpdated)→ 删了重下

核心总结:
  三层仓库:本地(~/.m2 缓存)/中央(公网)/私服(公司代理+内部)
  查找顺序:本地→远程(私服)→缓存本地
  私服(Nexus):对外缓存代理+对内制品仓库
    hosted(存内部)/proxy(代理外部)/group(聚合一个地址)
  作用:加速+省流量+高可用+托管内部包+统一管控

Maven 仓库和私服实践建议:① 团队用私服(settings.xml 配 mirror 指向 group、所有依赖走私服)、② 内部库发私服 hosted(release/snapshot 分开)、③ 认证放 settings.xml 的 servers(别放 pom 避免泄露)、④ 本地仓库损坏删了重下或 mvn -U。常见问题:依赖下不下来查 mirror/网络、snapshot 不更新 mvn -U、发布 401 查认证、损坏的 jar 删了重下。理解「实践:团队用私服(mirror 指 group)+内部库发 hosted+认证放 servers+损坏重下;问题:下不下来查 mirror、snapshot 不更新 -U、401 查认证;三层本地/中央/私服,私服=对外代理+对内仓库(hosted/proxy/group)」,就掌握了实践与总结。

记忆钩子:「Maven 三层仓库:①本地仓库(~/.m2/repository,电脑缓存,构建先从这找,下过就存不再下)②中央/远程仓库(repo.maven.apache.org,公网公共,本地没有从这下)③私服(公司搭的 Nexus/Artifactory,中央仓库代理+内部制品仓库);查找顺序=本地→远程(配私服走私服)→缓存到本地;★私服核心价值=对外缓存代理(公司只一个出口拉公网依赖,第一个人下过其他人从私服拿,快省流量稳定)+对内制品仓库(内部 jar 有地方发,团队共享);Nexus 三种仓库:hosted(存内部制品,maven-releases 正式版/maven-snapshots 快照)、proxy(代理外部并缓存,maven-central)、group(聚合成一个地址 maven-public,先找 hosted 再 proxy);拉依赖 mirror 指 group、发布 distributionManagement 指 hosted,mvn deploy 按版本选仓库(install 装本地/deploy 发私服)」

七、常见误区与追问

  • 误区:Maven 每次构建都从中央仓库下载依赖。 只有第一次(本地没有)才下载——本地仓库(~/.m2/repository)是缓存,下载过的依赖存在本地,之后构建直接从本地用,不再下载;除非清空 .m2、换电脑、或依赖是 snapshot 版(会检查更新);所以第一次构建慢(要下载),之后快(用缓存)。
  • 误区:私服就是一个更快的中央仓库。 私服不只是代理缓存中央仓库(那只是它的 proxy 功能),它还有两个关键作用:一是托管公司内部制品(hosted 仓库,存公司自己写的、不能传公网的 jar,供团队内部共享);二是统一管控(控制能用哪些依赖、谁能发布、审计),所以私服是「对外缓存代理 + 对内制品仓库 + 统一管控」,不只是加速。
  • 误区:snapshot 版和 release 版发布是一样的。 不同——snapshot 版(版本号带 -SNAPSHOT,如 1.0-SNAPSHOT)发到 snapshotRepository,可以重复发布(同版本号覆盖,因为开发中会频繁改);release 版(正式版,如 1.0)发到 release 仓库,一般不允许覆盖(发布后就固定不变,保证依赖它的人拿到的始终一致);Maven deploy 会根据版本号是否带 -SNAPSHOT 自动选对应的仓库。
  • 误区:mvn install 就是把包发布到私服了。 不是——mvn install 只是把包装到「本地仓库」(~/.m2),只有本机能用;要发布到私服(团队都能用)要用 mvn deploy,并且配置 distributionManagement(发布地址)和 servers(认证);install 是本地、deploy 是远程。
  • 追问:Maven 找一个依赖的顺序是什么? ① 先查本地仓库(~/.m2/repository),有就直接用(不下载);② 本地没有,去远程仓库下载——如果 settings.xml 配了 mirror/私服,请求走私服(私服有缓存就直接给、没有则私服去中央仓库回源下载并缓存后给你),没配私服则直接去中央仓库(repo.maven.apache.org);③ 下载的依赖存入本地仓库,下次构建直接用;snapshot 版会定期检查更新,可用 mvn -U 强制更新,mvn -o 离线只用本地。
  • 追问:Nexus 的 hosted、proxy、group 仓库分别是什么? hosted(宿主仓库):存放公司自己的制品,典型有 maven-releases(正式版)和 maven-snapshots(快照版),公司内部的 jar 发布到这里;proxy(代理仓库):代理外部仓库(如 maven-central 代理 Maven Central),第一次请求时从外部下载并缓存,之后从缓存提供;group(仓库组):把多个仓库(hosted + proxy)聚合成一个访问地址(如 maven-public),项目只需配这一个 URL,Nexus 会按组内配置的顺序查找(一般先找 hosted 内部包、再找 proxy 外部包),简化配置。
  • 追问:怎么把公司内部的 jar 发布到私服供团队使用? ① 在项目 pom.xml 里配 ,指定 repository(release 发布地址,指向 Nexus 的 maven-releases)和 snapshotRepository(snapshot 发布地址,指向 maven-snapshots);② 在 settings.xml 里配 ,放私服的账号密码(server 的 id 要和 distributionManagement 里的 id 对应),认证放这里而不是 pom(避免密码进版本控制);③ 执行 mvn deploy,Maven 根据版本号是否带 -SNAPSHOT 自动选择发到 snapshots 还是 releases 仓库;④ 其他项目在依赖里声明坐标即可从私服拉到(因为拉依赖走的 group 仓库聚合了 hosted)。

八、加强记忆

Maven 的仓库分三层① 本地仓库(~/.m2/repository,你电脑上的缓存,构建先从这找、下载过就存本地不再下)、② 中央/远程仓库(repo.maven.apache.org Maven Central,公网公共仓库、本地没有从这下)、③ 私服(公司搭的 Nexus/Artifactory)依赖查找顺序本地 → 远程(配了私服走私服,私服有缓存直接给、没有回源中央仓库)→ 缓存到本地私服(Nexus/Artifactory)的核心价值 = 对外缓存代理 + 对内制品仓库① 代理缓存(公司只一个出口拉公网依赖,第一个人下过其他人从私服拿,快、省外网流量)、② 高可用(内网稳定、不受外网波动)、③ 托管内部制品(内部 jar 有地方发、团队共享、不传公网)、④ 统一管控(控制依赖/谁能发布/审计)。Nexus 三种仓库类型hosted(存内部制品,maven-releases/maven-snapshots)、proxy(代理外部并缓存,maven-central)、group(聚合成一个地址 maven-public,先找 hosted 再 proxy);拉依赖的 mirror 指向 group、发布的 distributionManagement 指向 hosted(mvn deploy 按版本号选仓库,install 装本地/deploy 发私服)。一句话「Maven 三层仓库:本地(~/.m2 缓存)→远程(中央 repo.maven.apache.org)→私服(Nexus);查找先本地后远程(走私服)再缓存本地;私服=对外缓存代理(快省流量)+对内制品仓库(内部包共享)+统一管控,三种仓库 hosted(存内部)/proxy(代理外部)/group(聚合一个地址)」。