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(聚合一个地址)」。