4. Maven 制品管理:配置 settings.xml、部署与拉取依赖

Maven 是 Java 生态中最核心的构建工具,Nexus 作为私有制品仓库,与 Maven 的集成主要围绕三个环节:客户端认证配置、制品部署(Deploy)、依赖拉取(Resolve)。本章将详细拆解每一步的标准操作与常见陷阱。

前置条件:确保已安装 Maven 3.6+,并拥有 Nexus 中 maven-releases 和 maven-snapshots 仓库的读写权限。建议提前在 Nexus 中创建好对应的 Blob Store 和仓库。

4.1 Maven settings.xml 核心配置

settings.xml 是 Maven 的全局/用户级配置文件,位于 ~/.m2/settings.xml。与 Nexus 集成时,必须配置以下三个关键部分:

配置段 作用 必填项
<servers> 定义 Nexus 仓库的认证凭据(用户名/密码或 ) 是
<mirrors> 将 Maven Central 等远程仓库镜像到 Nexus,加速依赖下载 推荐
<profiles> 激活 Nexus 仓库地址,使 Maven 知道从哪里拉取/部署 是

以下是一个完整的 settings.xml 示例,包含上述三个配置段:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                              http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <!-- 1. 服务器认证凭据 -->
  <servers>
    <server>
      <id>nexus-releases</id>
      <username>deployer</username>
      <password>your_secure_password_or_</password>
    </server>
    <server>
      <id>nexus-snapshots</id>
      <username>deployer</username>
      <password>your_secure_password_or_</password>
    </server>
  </servers>

  <!-- 2. 镜像配置:拦截所有对 Maven Central 的请求 -->
  <mirrors>
    <mirror>
      <id>nexus-mirror</id>
      <mirrorOf>central</mirrorOf>
      <name>Nexus Central Mirror</name>
      <url>https://your-nexus-host/repository/maven-public/</url>
    </mirror>
  </mirrors>

  <!-- 3. Profile 激活仓库地址 -->
  <profiles>
    <profile>
      <id>nexus-profile</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>https://your-nexus-host/repository/maven-public/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>https://your-nexus-host/repository/maven-public/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>nexus-profile</activeProfile>
  </activeProfiles>
</settings>
安全提醒:切勿将明文密码提交到 Git 仓库。生产环境建议使用 mvn --encrypt-master-password 和 mvn --encrypt-password 生成加密凭据,或使用 Nexus 的 User 功能。

4.2 配置项目 POM.xml:部署目标仓库

在项目的 pom.xml 中,通过 <distributionManagement> 指定制品要部署到的 Nexus 仓库地址。注意 server id 必须与 settings.xml 中 <server> 的 id 完全一致。

<project>
  ...
  <distributionManagement>
    <repository>
      <id>nexus-releases</id>  <!-- 对应 settings.xml 中的 server id -->
      <name>Nexus Releases</name>
      <url>https://your-nexus-host/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
      <id>nexus-snapshots</id>
      <name>Nexus Snapshots</name>
      <url>https://your-nexus-host/repository/maven-snapshots/</url>
    </snapshotRepository>
  </distributionManagement>
  ...
</project>

版本号规则:

  • Release 版本:如 1.0.0、2.1.3,部署到 maven-releases 仓库,不允许重复覆盖(除非 Nexus 开启 Redeploy 策略)。
  • Snapshot 版本:如 1.0.0-SNAPSHOT,部署到 maven-snapshots 仓库,允许重复发布,Nexus 会自动保留历史版本。

4.3 部署 JAR/WAR 到 Nexus

完成配置后,执行以下命令即可将制品部署到 Nexus:

# 部署到 Releases 仓库(版本号不带 -SNAPSHOT)
mvn clean deploy -DskipTests

# 部署到 Snapshots 仓库(版本号带 -SNAPSHOT)
mvn clean deploy -DskipTests

# 指定 settings.xml 路径(适用于 CI/CD)
mvn clean deploy -s /path/to/custom-settings.xml

部署成功后,登录 Nexus Web UI,在 Browse > maven-releases 或 maven-snapshots 中即可看到上传的 JAR/WAR 制品及其对应的 POM 文件。

CI/CD 最佳实践:在 Jenkins/GitLab CI 中,建议使用 mvn deploy -B(Batch 模式)避免交互式输入,并通过环境变量注入 Nexus 凭据,避免硬编码。
Maven 制品部署到 Nexus 流程 开发者 / CI 触发 mvn clean deploy settings.xml 认证 Nexus 制品仓库 Web UI 验证 关键点:settings.xml 中的 server id 必须与 pom.xml 中的 distributionManagement id 完全一致,否则部署会因认证失败而报 401 错误。

4.4 从 Nexus 拉取依赖

当 settings.xml 配置了 <mirror> 和 <profile> 后,Maven 在构建时会自动从 Nexus 拉取依赖。拉取流程遵循以下优先级:

  1. 本地仓库(~/.m2/repository):检查是否已存在。
  2. Nexus 镜像:如果本地不存在,则从 maven-public 组仓库拉取。
  3. 远程代理:如果 Nexus 中也没有,Nexus 会从配置的远程代理(如 Maven Central)下载并缓存。

验证拉取是否生效,可以执行以下命令并观察日志:

# 清理本地缓存并重新下载依赖
mvn clean install -U

# 查看实际下载来源
mvn dependency:resolve -X | grep "Downloading"

如果日志中出现 Downloading from nexus-mirror 或 Downloading from central(指向 Nexus 地址),说明配置成功。

4.5 常见问题与排查

错误现象 根本原因 解决方案
401 Unauthorized settings.xml 中 server 的 id 与 pom.xml 不匹配,或凭据错误 检查 id 一致性;重置密码或使用 User
403 Forbidden 用户没有对应仓库的写权限 在 Nexus 中为用户分配 nx-repository-view-*-*-* 和 nx-repository-admin-*-*-* 权限
409 Conflict 尝试覆盖已存在的 Release 制品 修改版本号;或开启 Nexus 仓库的 Allow Redeploy 策略(不推荐生产)
依赖下载极慢或超时 Nexus 代理仓库未配置 Central 或网络不通 检查 Nexus 代理仓库的 Remote URL 是否正确;测试网络连通性
Maven 从 Nexus 拉取依赖流程 Maven 构建 本地 ~/.m2 Nexus 镜像 Maven Central Nexus 缓存 提示:使用 mvn dependency:resolve -U 强制更新快照依赖,确保从 Nexus 拉取最新版本。

4.6 标准模板集成要点

在企业级标准模板中,Maven 与 Nexus 的集成通常封装为以下三个可复用组件:

  • 基础 settings.xml 模板:包含镜像、Profile 和加密凭据占位符,由 CI/CD 系统在运行时注入真实凭据。
  • POM 父工程:统一管理 <distributionManagement>、插件版本和依赖版本,子项目无需重复配置。
  • CI/CD 流水线步骤:标准化 mvn deploy 命令,集成代码扫描、单元测试、制品签名等环节。
模板化收益:新项目接入时只需继承父 POM 并引用标准 settings.xml,即可自动获得 Nexus 部署与依赖拉取能力,减少配置错误,提升交付效率。