广告位 · 页头(后台-模块管理-新建模块后替换此区域)

如何在CentOS上搭建Nexus私服并管理Maven仓库?

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

如何在CentOS上搭建Nexus私服并管理Maven仓库?

环境准备与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 版本前务必先备份,升级后检查各仓库状态和已发布构件是否完整,避免因版本迁移导致数据丢失。

广告位 · 文章底部(后台-模块管理替换此区域)