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 凭据,避免硬编码。
4.4 从 Nexus 拉取依赖
当 settings.xml 配置了 <mirror> 和 <profile> 后,Maven 在构建时会自动从 Nexus 拉取依赖。拉取流程遵循以下优先级:
- 本地仓库(
~/.m2/repository):检查是否已存在。 - Nexus 镜像:如果本地不存在,则从
maven-public组仓库拉取。 - 远程代理:如果 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 是否正确;测试网络连通性 |
4.6 标准模板集成要点
在企业级标准模板中,Maven 与 Nexus 的集成通常封装为以下三个可复用组件:
- 基础 settings.xml 模板:包含镜像、Profile 和加密凭据占位符,由 CI/CD 系统在运行时注入真实凭据。
- POM 父工程:统一管理
<distributionManagement>、插件版本和依赖版本,子项目无需重复配置。 - CI/CD 流水线步骤:标准化
mvn deploy命令,集成代码扫描、单元测试、制品签名等环节。
模板化收益:新项目接入时只需继承父 POM 并引用标准 settings.xml,即可自动获得 Nexus 部署与依赖拉取能力,减少配置错误,提升交付效率。