Maven 私服搭建 —— Nexus Repository 3 从安装到运维
私服(私有仓库)是团队依赖管理的基础设施:统一缓存中央仓库、托管内部构件、控制发布权限。Nexus Repository 3 是最流行的方案,本文从安装到运维完整走一遍。
为什么要私服
| 问题 | 私服方案 |
|---|---|
| 每个人直连中央仓库,下载慢、流量浪费 | 私服代理中央仓库,缓存一次全局复用 |
| 内部 jar 无处存放 | hosted 仓库托管内部构件 |
| 依赖版本不可控 | 仓库策略控制 release/snapshot 发布 |
| 依赖安全审计难 | 统一入口,集中审计 |
安装 Nexus
下载与解压
Nexus 3 提供 nexus-3.x.x-unix.tar.gz(Linux/macOS)与 nexus-3.x.x-win64.zip(Windows)。
bash
# 下载(示例版本 3.72.0)
wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz
tar -zxvf latest-unix.tar.gz解压后两个目录:
sonatype-work/ 数据目录(仓库存储、配置、日志)
nexus-3.x.x/ 程序目录启动
bash
# 前台启动(首次)
./nexus-3.x.x/bin/nexus run
# 后台启动(生产)
./nexus-3.x.x/bin/nexus start端口与访问
默认端口 8081:http://localhost:8081/
首次登录:
账号:admin
密码:存储在 sonatype-work/nexus3/admin.password 文件中登录后强制修改密码,并按向导配置匿名访问策略。
系统要求
- JDK 8+(Nexus 3 自带嵌入式 JDK)
- 内存:建议 2GB+(
INSTALL4J_ADD_VM_PARAMS可调 JVM 参数) - 磁盘:仓库数据按需预留
仓库类型
Nexus 3 的 Maven 仓库分三类:
hosted(本地托管)
私有存储,用于发布内部构件:
- maven-releases:正式版本(release),默认不允许重复发布(同版本覆盖需改策略)
- maven-snapshots:快照版本(-SNAPSHOT),允许重复覆盖
proxy(代理)
代理远程仓库并缓存:
- maven-central:代理中央仓库(内置默认)
- 可自定义代理阿里云等镜像
group(组合)
聚合多个仓库为统一访问入口,开发人员只需配这一个地址:
maven-public(group)= maven-releases + maven-snapshots + maven-central客户端接入配置
1. 镜像指向私服(settings.xml)
xml
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>Nexus 私服</name>
<url>http://192.168.1.10:8081/repository/maven-public/</url>
</mirror>
</mirrors>mirrorOf=* 让所有仓库请求都走私服,由私服内部的 group 统一分发。
2. 发布认证(settings.xml)
xml
<servers>
<server>
<id>nexus-releases</id>
<username>deploy-user</username>
<password>deploy-password</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>deploy-user</username>
<password>deploy-password</password>
</server>
</servers>3. 配置发布仓库(pom.xml)
xml
<distributionManagement>
<repository>
<id>nexus-releases</id>
<url>http://192.168.1.10:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<url>http://192.168.1.10:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>发布与部署
发布正式版本
bash
mvn deploy # 版本号不带 -SNAPSHOT 时,发布到 maven-releases发布快照版本
bash
# 版本号为 1.0.0-SNAPSHOT 时
mvn deploy # 发布到 maven-snapshots发布前的版本管理
结合 release 流程:
bash
mvn release:prepare # 检查、打 tag、升版本
mvn release:perform # 从 tag 构建并 deploy或用 ${revision} + CI 流水线注入版本号(见多模块最佳实践)。
日常运维
备份
私服的核心数据在 sonatype-work/nexus3/:
db/:仓库元数据(OrientDB/PostgreSQL)blobs/:二进制存储
bash
# 停止服务后备份数据目录(或使用 Nexus 管理界面的备份任务)
tar -czf nexus-backup.tar.gz sonatype-work/nexus3/db sonatype-work/nexus3/blobs清理
Nexus 内置Cleanup 策略:删除长时间未使用的旧快照、过期 release,控制磁盘占用。
监控
- 管理界面 → Support:查看 JVM 内存、日志、线程
- 关注磁盘使用率(blobs 增长)
常见故障
| 问题 | 处理 |
|---|---|
| 磁盘被 blobs 占满 | 配置 Cleanup 策略清理旧构件 |
| 内存不足启动失败 | 调大 INSTALL4J_ADD_VM_PARAMS 的 -Xmx |
| 构件下载 404 | 检查 group 是否包含对应 proxy/hosted 仓库 |
| 部署 401 | 检查 settings.xml 的 server id 与仓库权限 |
安全与权限
Nexus 3 支持:
- 角色/用户:匿名只读、开发上传、管理员
- 仓库权限:不同仓库限定不同角色访问
- 匿名访问开关:内网环境常开启,公网关闭
- HTTPS:通过反向代理(Nginx)终止 TLS
常见问题
- mirrorOf 用
*好还是central? 团队统一走私服用*,私服内 group 分发;只想加速中央仓库用central。 - 部署到 releases 仓库被拒? 默认不允许重复发布同版本,删除旧构件或改 Deployment policy 为 Allow redeploy。
- 私服挂了怎么办? 本地仓库有缓存可继续构建;恢复后重启 Nexus 即可。
- 与阿里云镜像的关系? 可让 Nexus 的 proxy 仓库指向阿里云镜像,享受国内加速 + 私服统一缓存双重收益。