1. 概述

之前的文章中,我讨论过如何将尚未部署到Maven中央仓库的第三方jar包安装到本地仓库。这种方案仅适用于小型项目——当项目规模增长时,维护完整的Nexus服务器就显得必要了。

随着项目发展,Nexus迅速成为托管第三方构件和跨开发流复用内部构件的唯一成熟方案。本文将演示如何使用Maven将项目构件部署到Nexus

2. pom.xml中的Nexus配置

要让Maven在构建的package阶段部署构件,需通过distributionManagement元素指定目标仓库:

<distributionManagement>
   <snapshotRepository>
      <id>nexus-snapshots</id>
      <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
   </snapshotRepository>
</distributionManagement>

Nexus默认提供公共的Snapshots仓库,无需额外配置。每个仓库的Summary标签页都会直接显示需添加到项目pom中的<distributionManagement>配置,简单粗暴。

3. 插件配置

默认情况下,Maven通过maven-deploy-plugin处理部署,它绑定在默认生命周期的deploy阶段:

<plugin>
   <artifactId>maven-deploy-plugin</artifactId>
   <version>2.8.1</version>
   <executions>
      <execution>
         <id>default-deploy</id>
         <phase>deploy</phase>
         <goals>
            <goal>deploy</goal>
         </goals>
      </execution>
   </executions>
</plugin>

但该插件无法充分利用Nexus的高级功能(如staging)。Sonatype为此开发了专用插件nexus-staging-maven-plugin,专为深度集成Nexus设计。

3.1 禁用默认插件

首先禁用默认部署插件:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-deploy-plugin</artifactId>
   <version>${maven-deploy-plugin.version}</version>
   <configuration>
      <skip>true</skip>
   </configuration>
</plugin>

3.2 配置Nexus专用插件

<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</serverId>
      <nexusUrl>http://localhost:8081/nexus/</nexusUrl>
      <skipStaging>true</skipStaging>
   </configuration>
</plugin>

⚠️ 关键配置说明:

  • skipStaging=true:禁用staging功能(部署-SNAPSHOT构件时不需要)
  • 默认情况下,deploy目标会包含staging工作流,推荐用于正式发布

4. 全局settings.xml配置

部署到Nexus是安全操作——每个Nexus实例都内置了deployment用户。凭据配置需在全局Maven settings.xml中完成:

<servers>
   <server>
      <id>nexus-snapshots</id>
      <username>deployment</username>
      <password>nexus123</password>
   </server>
</servers>

✅ 配置要点:

  • 禁止在pom.xml中存储凭据(语法不支持+安全风险)
  • 服务器可配置为基于密钥认证(非明文密码)

5. 部署流程

执行部署只需一条命令:

mvn clean deploy -Dmaven.test.skip=true

5.1 关于跳过测试

在部署流水线中跳过测试是合理的,因为:

  • 测试应由流水线中的前置任务完成
  • 部署任务应是流水线最后环节
  • 典型场景:Jenkins任务链,仅当前置任务成功时才触发部署

5.2 完整测试方案

若直接执行单次命令,建议保留测试:

mvn clean deploy

6. 总结

本文提供了一种简单高效的Maven构件Nexus部署方案,核心选择包括:

  • 使用nexus-staging-maven-plugin替代默认插件
  • 禁用非必要的staging功能
  • 全局配置安全凭据

这种方案虽带倾向性,但正是这些取舍保证了其实用性。未来可探讨:

  • 完整启用staging功能
  • 发布流程实践

最后,下篇文章将深入讨论发布流程。


原始标题:Maven Deploy to Nexus