3. Maven 仓库类型详解:Hosted / Proxy / Group
Nexus Repository Manager 作为中央二进制存储平台,其核心能力通过三种仓库类型实现:Hosted(宿主仓库)、Proxy(代理仓库) 和 Group(组仓库)。理解这三种类型的差异与协作关系,是构建高效、安全的 Maven 制品管理策略的基础。
3.1 三种仓库类型对比
| 特性 | Hosted(宿主) | Proxy(代理) | Group(组) |
|---|---|---|---|
| 存储方式 | 本地物理存储,由用户主动上传 | 远程缓存,按需拉取并缓存到本地 | 逻辑聚合,不存储实体 |
| 数据来源 | 手动部署、CI/CD 推送、API 上传 | 远程公共仓库(如 Maven Central) | 组合多个 Hosted 和 Proxy 仓库 |
| 主要用途 | 存放内部私有构件、第三方商业 JAR、SNAPSHOT | 代理外部依赖,加速构建并降低外网依赖 | 提供统一访问入口,屏蔽后端仓库细节 |
| 访问策略 | Read / Write / Deploy | Read / Cache / Expire | Read Only(路由到成员仓库) |
| 典型场景 | 内部 SDK、安全扫描通过的第三方包 | Maven Central、JCenter、Google Maven | 开发、测试、生产各环境统一仓库地址 |
3.2 适用场景详解
Hosted 仓库
- 内部私有构件:存放公司自研的公共库、中间件、工具包,避免暴露到公共仓库。
- 第三方商业 JAR:Oracle JDBC、特定商业许可的 SDK,无法从公共仓库获取。
- SNAPSHOT 版本管理:开发过程中的不稳定版本,支持频繁覆盖部署。
- 安全合规:经过安全扫描、SBOM 生成后的“白名单”制品,确保供应链安全。
Proxy 仓库
- 加速构建:缓存远程依赖,避免每次构建都从外网下载,显著提升 CI/CD 速度。
- 网络隔离:内网环境无法直接访问外网时,通过代理仓库统一拉取并缓存。
- 版本锁定:通过配置缓存策略,确保团队使用一致的依赖版本,避免远程仓库变更导致构建失败。
Group 仓库
- 统一入口:将多个 Hosted 和 Proxy 仓库组合成一个虚拟仓库,开发者只需配置一个 URL。
- 环境隔离:为开发、测试、生产环境分别创建 Group,每个 Group 包含不同的成员仓库。
- 优先级控制:通过调整成员仓库顺序,实现“先查内部仓库,再查代理缓存,最后查远程”的依赖解析策略。
最佳实践: 生产环境建议使用 Group 仓库作为 Maven settings.xml 中唯一的 mirror 配置。Group 内部按优先级排列:Hosted(内部制品)→ Proxy(缓存)→ Proxy(远程)。这样既能保证内部制品的优先使用,又能利用缓存加速,同时保留远程回退能力。
3.3 仓库协作关系图
下图展示了三种仓库类型在典型企业环境中的协作关系:
3.4 创建 Maven2 代理仓库(实战步骤)
以下操作基于 Nexus Repository Manager OSS 3.x 版本,以代理 Maven Central 为例:
- 登录 Nexus 管理后台:使用管理员账号(默认 admin / admin123)登录,访问
http://<nexus-host>:8081/。 - 进入仓库管理:点击顶部菜单 齿轮图标(Settings) → 左侧 Repositories → 点击 Create repository。
- 选择仓库类型:在列表中选择 maven2 (proxy)。
- 填写基础配置:
- Name:
maven-central-proxy(建议使用有意义的命名规范) - Remote storage:
https://repo1.maven.org/maven2/(Maven Central 官方地址) - Blob store:选择或创建专用的 Blob Store(如
maven-proxy-blob)
- Name:
- 配置缓存策略(可选但推荐):
- Maximum component age:设置为
1440分钟(24 小时),避免频繁检查远程更新 - Metadata max age:设置为
1440分钟
- Maximum component age:设置为
- 配置 HTTP 连接(如有代理):如果 Nexus 需要通过企业代理访问外网,在 HTTP 或 HTTPS 选项卡中填写代理信息。
- 点击 Create repository 完成创建。
验证代理仓库: 创建完成后,在浏览器中访问
http://<nexus-host>:8081/repository/maven-central-proxy/,应能看到 Maven Central 的目录结构。首次访问时,Nexus 会立即开始缓存远程索引。
3.5 代理仓库关键配置参数
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Remote storage | 官方仓库 URL | 代理的目标远程仓库地址 |
| Blob store | 专用 Blob Store | 建议为 Proxy 仓库单独分配存储,便于容量管理 |
| Maximum component age | 1440(分钟) | 缓存组件的最大存活时间,过期后重新检查远程 |
| Metadata max age | 1440(分钟) | 元数据缓存时间,影响依赖解析的时效性 |
| Item max age | 1440(分钟) | 非组件文件(如索引)的缓存时间 |
| Block outbound | false | 是否阻止出站连接,用于模拟离线测试 |
| Auto block | true | 远程不可用时自动阻止出站,避免构建挂起 |
3.6 代理仓库的缓存与过期机制
理解 Proxy 仓库的缓存行为,对于保障构建稳定性和供应链安全至关重要:
- 首次请求:当客户端请求一个构件时,Nexus 先检查本地缓存。未命中则从远程仓库下载,并存储到 Blob Store。
- 缓存命中:后续相同请求直接返回缓存内容,不产生远程网络开销。
- 过期检查:根据 Maximum component age 配置,Nexus 在缓存过期后,会向远程仓库发送
HEAD请求检查文件是否更新。若未更新,则重置缓存时间;若更新,则重新下载。 - 强制刷新:在 Nexus 管理界面中,可以手动对特定组件执行 Invalidate cache,强制下次请求重新拉取。
供应链安全提示: 代理仓库的缓存策略直接影响 SBOM 的准确性。如果缓存时间过长,可能导致 SBOM 中记录的依赖版本与实际构建使用的版本不一致。建议在关键安全审计前,手动刷新代理仓库缓存,并配合
mvn dependency:tree 验证依赖版本。
3.7 创建 Group 仓库整合三种类型
完成 Hosted 和 Proxy 仓库创建后,通常需要创建一个 Group 仓库作为统一入口:
- 点击 Create repository → 选择 maven2 (group)。
- Name:
maven-all-group。 - 在 Member repositories 中,按优先级顺序添加:
- 内部 Hosted 仓库(如
maven-releases、maven-snapshots) - Proxy 仓库(如
maven-central-proxy) - 其他第三方代理仓库(如
maven-google-proxy)
- 内部 Hosted 仓库(如
- 点击 Create repository 完成。
配置完成后,开发者只需在 settings.xml 中配置一个 mirror 指向 Group 仓库:
<mirrors>
<mirror>
<id>nexus-group</id>
<mirrorOf>*</mirrorOf>
<url>http://<nexus-host>:8081/repository/maven-all-group/</url>
</mirror>
</mirrors>
通过 Group 仓库,Nexus 会按照成员仓库的顺序依次查找依赖,实现“内部优先 → 缓存优先 → 远程回退”的智能路由策略。