1. 概述

在上一篇系列文章中,我们已经搭建了 Maven 部署到 Nexus 的流程。本文将深入讲解 Maven 发布流程的完整配置——包括项目 pom.xml 中的配置以及 Jenkins 任务中的实现。

2. 在 pom 中配置仓库

要让 Maven 能发布到 Nexus 仓库服务器,必须通过 distributionManagement 元素 定义仓库信息

<distributionManagement>
   <repository>
      <id>nexus-releases</id>
      <url>http://localhost:8081/nexus/content/repositories/releases</url>
   </repository>
</distributionManagement>

✅ Nexus 默认自带 Releases 仓库,无需手动创建。

3. 在 Maven pom 中配置 SCM

发布流程会与项目的源代码管理系统交互——因此必须先在 pom.xml 中定义 <scm> 元素:

<scm>
   <connection>scm:git:https://github.com/user/project.git</connection>
   <url>http://github.com/user/project</url>
   <developerConnection>scm:git:https://github.com/user/project.git</developerConnection>
</scm>

或使用 git 协议:

<scm>
   <connection>scm:git:[email protected]:user/project.git</connection>
   <url>scm:git:[email protected]:user/project.git</url>
   <developerConnection>scm:git:[email protected]:user/project.git</developerConnection>
</scm>

⚠️ 确保所有 URL 指向正确的 Git 仓库地址。

4. 配置 Release 插件

发布流程的标准 Maven 插件是 maven-release-plugin——其配置非常精简:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-release-plugin</artifactId>
   <version>2.4.2</version>
   <configuration>
      <tagNameFormat>v@{project.version}</tagNameFormat>
      <autoVersionSubmodules>true</autoVersionSubmodules>
      <releaseProfiles>releases</releaseProfiles>
   </configuration>
</plugin>

关键配置说明:

  • releaseProfiles 强制激活名为 releases 的 Maven profile
  • autoVersionSubmodules=true 确保所有子模块版本与父版本同步(设为 false 时需手动输入每个模块版本)

发布过程中会使用 nexus-staging-maven-plugin 部署到 Nexus:

<profiles>
   <profile>
      <id>releases</id>
      <build>
         <plugins>
            <plugin>
               <groupId>org.sonatype.plugins</groupId>
               <artifactId>nexus-staging-maven-plugin</artifactId>
               <version>1.5.1</version>
               <executions>
                  <execution>
                     <id>default-deploy</id>
                     <phase>deploy</phase>
                     <goals>
                        <goal>deploy</goal>
                     </goals>
                  </execution>
               </executions>
               <configuration>
                  <serverId>nexus-releases</serverId>
                  <nexusUrl>http://localhost:8081/nexus/</nexusUrl>
                  <skipStaging>true</skipStaging>
               </configuration>
            </plugin>
         </plugins>
      </build>
   </profile>
</profiles>

⚠️ 插件配置为 跳过暂存机制skipStaging=true),与之前的部署流程一致。

安全配置
发布到 Nexus 是受保护操作——需在全局 settings.xml%USER_HOME%/.m2/settings.xml)中配置凭证:

<servers>
   <server>
      <id>nexus-releases</id>
      <username>deployment</username>
      <password>deployment_user_password</password>
   </server>
</servers>

5. 发布流程详解

将发布流程拆解为三个核心步骤。假设当前项目版本为快照版(如 0.1-SNAPSHOT):

5.1. release:clean

清理发布环境 会:

  • 删除发布描述符(release.properties
  • 删除所有备份的 POM 文件

5.2. release:prepare

准备发布 执行以下操作:

  • ✅ 执行检查:确保无未提交更改、无 SNAPSHOT 依赖
  • ✅ 将 pom 中的项目版本改为正式发布号(移除 SNAPSHOT 后缀)——示例中改为 0.1
  • ✅ 运行项目测试套件
  • ✅ 提交并推送更改
  • ✅ 基于非 SNAPSHOT 版本代码创建 Git 标签
  • ✅ 增加项目版本(示例中改为 0.2-SNAPSHOT
  • ✅ 提交并推送更改

5.3. release:perform

执行发布 会:

  • ✅ 从 SCM 检出发布标签
  • ✅ 构建并部署发布代码

⚠️ 此步骤依赖 prepare 阶段生成的 release.properties 文件。

6. 在 Jenkins 中实现

Jenkins 可通过两种方式执行发布:使用专用插件或直接运行 Maven 命令。鉴于 Maven 命令足够简洁,推荐直接使用标准 Maven 任务

  1. 创建 Jenkins 任务(构建 Maven 2/3 项目)
  2. 添加两个字符串参数:
    • releaseVersion=0.1
    • developmentVersion=0.2-SNAPSHOT
  3. Build 配置中执行以下 Maven 命令:
release:clean release:prepare release:perform 
   -DreleaseVersion=${releaseVersion} -DdevelopmentVersion=${developmentVersion}

运行时 Jenkins 会提示输入参数值——每次需正确填写 releaseVersiondevelopmentVersion

⚠️ 重要提醒

  • 建议安装 Workspace Cleanup Plugin 并勾选 Delete workspace before build starts
  • 禁止拆分任务prepareperform 必须在同一命令中执行(因后者依赖前者生成的 release.properties

7. 总结

本文完整演示了 Maven 项目发布流程 的实现方案(含 Jenkins 集成)。与部署流程类似,核心通过 nexus-staging-maven-plugin 与 Nexus 交互,并重点适配了 Git 项目的发布场景。


原始标题:Maven Release to Nexus