Maven 私服的核心作用是缓存外部依赖和托管内部制品。CentOS 服务器上运行 Nexus Repository Manager 后,开发机只需要访问内网的 Nexus 地址,就能获取到所有构建所需的依赖,而不需要每台机器都直接访问 Maven Central。第一次请求某个依赖时,Nexus 会从外网拉取并保存到本地存储,后续再请求就直接返回缓存,显著降低外网带宽压力,也避免了外部仓库临时不可用带来的构建中断。对于企业或多人协作团队,这种集中管理方式还能统一依赖版本、发布内部公共模块,让制品流转更加可控。

环境准备与Nexus安装
CentOS 7 或 CentOS 8 都可以运行 Nexus,官方推荐使用 JDK 8 或 JDK 11。安装前先检查系统是否已经包含 Java 环境,执行 java -version 查看版本。如果没有安装,可以使用 yum 安装 OpenJDK 11,命令为 yum install -y java-11-openjdk-devel。安装完成后再次确认 JAVA_HOME 是否指向正确路径,通常位于 /usr/lib/jvm/ 目录下。Nexus 3.x 对 JDK 版本比较敏感,过高或过低都可能导致启动异常,建议优先选择 JDK 8 更新版本或 JDK 11。
Nexus 安装包可以从 Sonatype 官方下载页面获取。下载后解压到 /opt 目录,解压会得到 nexus-3.x.x 和 sonatype-work 两个目录,前者是程序文件,后者是数据存储目录。为了安全,不建议使用 root 用户直接运行 Nexus,应当创建独立的系统用户并授权。下面的命令展示了完整的下载、解压和授权过程:
cd /opt wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz tar -xzf latest-unix.tar.gz mv nexus-3* nexus useradd -M -s /sbin/nologin nexus chown -R nexus:nexus /opt/nexus chown -R nexus:nexus /opt/sonatype-work
解压后不要急着启动,建议先修改 Nexus 的运行用户和内存参数。打开 /opt/nexus/bin/nexus.rc 文件,将 run_as_user 取消注释并设置为 nexus。内存参数在 /opt/nexus/bin/nexus.vmoptions 中调整,默认的 -Xms2703m 和 -Xmx2703m 对内存较小的服务器可能不合适,可以根据实际内存调整为 1024m 或 2048m。修改完成后保存文件,然后用 su - nexus -c "/opt/nexus/bin/nexus start" 启动服务。第一次启动会初始化数据库和配置,需要等待一段时间,可以通过 tail -f /opt/sonatype-work/nexus3/log/nexus.log 查看启动日志。
如果希望 Nexus 开机自启,最方便的方式是编写 systemd 服务文件。将以下内容保存为 /etc/systemd/system/nexus.service,然后执行 systemctl daemon-reload 和 systemctl enable nexus 即可。这样服务器重启后 Nexus 会自动拉起,不需要人工干预。
[Unit] Description=Nexus Repository Manager After=network.target [Service] Type=forking User=nexus Group=nexus ExecStart=/opt/nexus/bin/nexus start ExecStop=/opt/nexus/bin/nexus stop Restart=on-abort [Install] WantedBy=multi-user.target
配置Maven仓库类型与仓库组
Nexus 中的 Maven 仓库分为三种类型:hosted 表示托管仓库,用于存放自己发布的构件;proxy 表示代理仓库,用于缓存远程仓库的构件;group 表示仓库组,可以把多个 hosted 和 proxy 仓库聚合到一个地址对外提供服务。对于团队使用,最常用的做法是创建一个 maven-releases 托管仓库、一个 maven-snapshots 托管仓库、一个 maven-central 代理仓库,然后创建一个 maven-public 仓库组,把这三个仓库都加进去。开发机只需要配置 maven-public 这一个地址,就能同时拉取内部发布构件和外部依赖。
新建仓库可以通过 Nexus 的 Web 管理界面完成。默认管理员账号是 admin,密码在首次启动后生成于 /opt/sonatype-work/nexus3/admin.password 文件中。登录后进入 Repository 设置,选择 Create repository,然后根据需要选择 maven2 (hosted)、maven2 (proxy) 或 maven2 (group)。以代理 Central 为例,远程仓库 URL 一般填写 https://repo1.maven.org/maven2/,并在 Storage 中设置合适的 Blob store。创建仓库组时,把 maven-central、maven-releases、maven-snapshots 拖到 Members 列表中即可。
配置完成后,需要修改 Maven 的 settings.xml 文件,让所有构件请求都走 Nexus 仓库组。可以在 settings.xml 中配置 mirror,将 mirrorOf 设置为 * 或 external:*,这样所有仓库请求都会被重定向到 Nexus。但要注意,如果直接使用 * 会拦截所有仓库,包括 release 和 snapshot,因此最好配合仓库组的策略来使用。以下配置示例将默认中央仓库的请求镜像到本地 Nexus:
<settings>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.1.100:8081/repository/maven-public/</url>
</mirror>
</mirrors>
</settings>
Mirror 配置中的 url 可以写成 HTTP 或 HTTPS,生产环境建议启用 HTTPS 并配置证书。如果 Nexus 部署在云服务器上,地址应当使用内网 IP 或域名,避免使用 localhost。mirrorOf 使用 * 时需要注意,所有仓库请求都会走 Nexus,包括 snapshot 仓库的请求,因此 Nexus 的 group 中必须同时包含 releases 和 snapshots 的成员仓库,否则快照依赖会拉取失败。如果只想镜像 Central,可以把 mirrorOf 改为 central,但这样内部发布构件仍需要单独配置 repository 地址。
发布与使用私有构件
要让项目中的 jar 包或 war 包发布到 Nexus 私有仓库,需要在 pom.xml 中配置 distributionManagement 节点。该节点指定发布到哪个 hosted 仓库,一般 release 版本发布到 maven-releases,snapshot 版本发布到 maven-snapshots。仓库的 id 必须与 settings.xml 中 server 配置的 id 相对应,Nexus 会根据这个 id 找到对应的用户名和密码进行认证。下面是典型的 pom.xml 发布配置:
<distributionManagement>
<repository>
<id>nexus-releases</id>
<url>http://192.168.1.100:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<url>http://192.168.1.100:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
settings.xml 中还需要配置对应的 server 认证信息。server 的 id 与 pom 中的 repository id 一致,用户名和密码填写 Nexus 的管理员账号或具有发布权限的自定义用户。为了避免密码明文泄露,Maven 支持使用加密密码,但基础环境可以直接先写明文,后续再替换为加密方式。配置示例:
<settings>
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
</settings>
完成以上配置后,在项目根目录执行 mvn clean deploy 就可以触发发布。如果项目版本号以 -SNAPSHOT 结尾,Maven 会自动选择 snapshotRepository;如果是正式版本,则选择 repository。发布成功后,可以在 Nexus 的 Browse 界面中看到对应构件。其他项目若想引用该私有构件,只需要在其 pom.xml 中声明同样的 groupId、artifactId 和 version,并且在 settings.xml 中已经配置了 Nexus 镜像,Maven 就能自动从私服拉取。
生产环境调优与故障排查
Nexus 运行一段时间后,缓存和存储会逐渐增大,需要定期关注磁盘空间和 Blob store 的使用情况。默认 Blob store 位于 /opt/sonatype-work/nexus3/blobs 目录,可以通过 Nexus 管理界面查看各组件的存储占用。对于代理仓库,可以启用负缓存和重新获取策略,避免过期元数据影响构建。IP 访问限制、匿名访问开关和 RBAC 权限控制也需要根据团队情况进行调整,建议禁用匿名访问,并为不同角色分配最小权限。
常见启动故障之一是端口冲突,Nexus 默认监听 8081 端口,如果该端口被其他程序占用,可以在 /opt/nexus/etc/nexus-default.properties 中修改 application-port 参数。另一个常见问题是内存不足,Nexus 启动时如果日志中出现 OutOfMemoryError,需要调整 nexus.vmoptions 中的堆内存参数。还有一类问题是代理仓库无法连通外部中央仓库,可以通过 Nexus 的 Status 界面检查代理仓库的远程连接状态,同时确认服务器防火墙是否允许出站 HTTPS 请求。
备份是生产环境不可忽视的工作。Nexus 的数据包括配置和仓库内容,备份时需要同时保存 sonatype-work 目录和数据库文件。可以编写定时任务,将 /opt/sonatype-work 目录打包并同步到备份服务器。恢复时先停止 Nexus 服务,再还原目录,最后启动服务。此外,升级 Nexus 版本前务必先备份,升级后检查各仓库状态和已发布构件是否完整,避免因版本迁移导致数据丢失。

