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 仓库协作关系图

下图展示了三种仓库类型在典型企业环境中的协作关系:

Nexus 三种仓库类型协作关系 Nexus 仓库类型协作架构 开发者 / CI 构建 Group 仓库(统一入口) Hosted 宿主仓库 Proxy 代理仓库 远程公共仓库 内部制品 / CI 部署 缓存存储(Blob Store) Maven Central / JCenter SBOM 证据留存 / 安全扫描 / 审计追踪

3.4 创建 Maven2 代理仓库(实战步骤)

以下操作基于 Nexus Repository Manager OSS 3.x 版本,以代理 Maven Central 为例:

  1. 登录 Nexus 管理后台:使用管理员账号(默认 admin / admin123)登录,访问 http://<nexus-host>:8081/。
  2. 进入仓库管理:点击顶部菜单 齿轮图标(Settings) → 左侧 Repositories → 点击 Create repository。
  3. 选择仓库类型:在列表中选择 maven2 (proxy)。
  4. 填写基础配置:
    • Name:maven-central-proxy(建议使用有意义的命名规范)
    • Remote storage:https://repo1.maven.org/maven2/(Maven Central 官方地址)
    • Blob store:选择或创建专用的 Blob Store(如 maven-proxy-blob)
  5. 配置缓存策略(可选但推荐):
    • Maximum component age:设置为 1440 分钟(24 小时),避免频繁检查远程更新
    • Metadata max age:设置为 1440 分钟
  6. 配置 HTTP 连接(如有代理):如果 Nexus 需要通过企业代理访问外网,在 HTTP 或 HTTPS 选项卡中填写代理信息。
  7. 点击 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 仓库作为统一入口:

  1. 点击 Create repository → 选择 maven2 (group)。
  2. Name:maven-all-group。
  3. 在 Member repositories 中,按优先级顺序添加:
    • 内部 Hosted 仓库(如 maven-releases、maven-snapshots)
    • Proxy 仓库(如 maven-central-proxy)
    • 其他第三方代理仓库(如 maven-google-proxy)
  4. 点击 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 会按照成员仓库的顺序依次查找依赖,实现“内部优先 → 缓存优先 → 远程回退”的智能路由策略。