deploy 命令是做什么的?
deploy 命令是 Maven 生命周期中的一个阶段,它的核心作用是:将你构建好的构件(Artifact,通常是 JAR 或 WAR 包)及其相关的 POM 文件部署到远程仓库中。

这个远程仓库通常是你的组织内部的私服,Nexus 或 Artifactory,通过将构件部署到私服,团队内的其他成员就可以方便地在他们的项目中引用这个构件,而无需从中央仓库下载,从而提高构建速度和稳定性。
Maven 生命周期中的位置
deploy 是 Maven 生命周期中最靠后的几个阶段之一,它的执行依赖于之前的所有阶段。
标准的 Maven 生命周期片段如下:
validate -> compile -> test -> package -> verify -> install -> deploy
install: 将构件安装到你的本地 Maven 仓库 (~/.m2/repository),这只是为了你当前的开发环境使用。deploy: 将构件从你的本地仓库部署到远程的配置好的仓库,这是为了团队共享。
重要提示:当你执行 mvn deploy 时,Maven 会自动按顺序执行它之前的所有阶段,包括 package, test, compile 等,所以你不需要手动先 package 再 deploy。

如何使用 deploy 命令?
基本用法
在项目的根目录下(包含 pom.xml 的目录),打开终端并运行:
mvn deploy
如果一切配置正确,Maven 会完成以下步骤:
- 编译、测试、打包你的项目。
- 将生成的构件(如
my-app-1.0.jar)和pom.xml文件上传到你在pom.xml中配置的远程仓库。
关键配置:pom.xml 和 settings.xml
deploy 命令能否成功,完全取决于你的配置,主要有两个配置文件需要关注:
A. 项目的 pom.xml
在 pom.xml 中,你需要指定两个关键信息:

- 远程仓库的 ID
- 要部署的构件信息(通常由
groupId,artifactId,version决定)
在 pom.xml 的 <project> 标签内添加 <distributionManagement> 部分:
<project>
...
<distributionManagement>
<!--
这个 repository ID 必须与 settings.xml 中
<servers> 标签下的 <server> 的 ID 完全一致。
-->
<repository>
<id>my-nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://your-nexus-server.com/repository/maven-releases/</url>
</repository>
<!-- 如果是快照版本,通常会部署到另一个仓库 -->
<snapshotRepository>
<id>my-nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://your-nexus-server.com/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
...
</project>
配置说明:
<id>: 这个 ID 是一个逻辑名称,用于关联settings.xml中的认证信息。必须保持一致!<url>: 这是你的私服(如 Nexus)提供的仓库上传地址。<repository>vs<snapshotRepository>: Maven 会根据你的项目版本号自动选择。- 如果你的版本号以
-SNAPSHOT如0-SNAPSHOT),Maven 会自动将构件部署到<snapshotRepository>指定的地址。 - 否则,它会部署到
<repository>指定的地址。
- 如果你的版本号以
B. 用户的 settings.xml
这个文件通常位于用户主目录下的 .m2 文件夹中(C:\Users\YourUsername\.m2\settings.xml 或 ~/.m2/settings.xml)。
你需要提供访问远程仓库的用户名和密码。pom.xml 中的 <id> 就在这里对应。
在 <settings> 标签内添加 <servers> 部分:
<settings>
...
<servers>
<!--
这个 ID 必须与 pom.xml 中 <distributionManagement>
下 <repository> 或 <snapshotRepository> 的 ID 完全一致。
-->
<server>
<id>my-nexus-releases</id>
<username>your-username</username>
<password>your-password</password>
</server>
<server>
<id>my-nexus-snapshots</id>
<username>your-username</username>
<password>your-password</password>
</server>
</servers>
...
</settings>
配置说明:
<id>: 这里的 ID 必须与pom.xml中定义的仓库 ID 完全匹配。<username>和<password>: 这是你在 Nexus/Artifactory 等私服上配置的具有部署权限的用户凭证。
完整示例
假设我们要将一个项目部署到 Nexus 私服。
步骤 1: pom.xml 配置
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version> <!-- 正式版本,会部署到 releases 仓库 -->
<!-- <version>1.0.0-SNAPSHOT</version> --> <!-- 如果是快照,会部署到 snapshots 仓库 -->
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<!-- ... 其他依赖和插件配置 ... -->
</project>
步骤 2: settings.xml 配置
<settings ...>
<servers>
<server>
<!-- ID 必须和 pom.xml 中的一致 -->
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<!-- ID 必须和 pom.xml 中的一致 -->
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
</settings>
步骤 3: 执行部署
在项目根目录运行:
mvn deploy
执行过程:
- Maven 读取
pom.xml,发现distributionManagement配置。 - 它看到版本号是
0.0(非快照),所以决定部署到 ID 为nexus-releases的仓库。 - Maven 读取
settings.xml,在<servers>中查找 ID 为nexus-releases的<server>。 - 找到后,使用其中配置的
username和password对http://localhost:8081/repository/maven-releases/进行认证。 - 上传
my-app-1.0.0.jar和my-app-1.0.0.pom文件。
如果版本是 0.0-SNAPSHOT,Maven 会自动切换到 nexus-snapshots 仓库和对应的认证信息。
常见问题与最佳实践
-
认证失败 (401 Unauthorized)
- 原因:最常见的问题是
pom.xml中的<id>和settings.xml中的<id>不匹配,或者用户名/密码错误。 - 解决:仔细检查两个 ID 是否完全一致,并确认私服上的用户是否有“部署”(Deploy)权限。
- 原因:最常见的问题是
-
找不到服务器 (404 Not Found)
- 原因:
pom.xml中配置的<url>错误,或者远程仓库路径不存在。 - 解决:检查私服仓库的 URL 是否正确。
- 原因:
-
如何部署到不同的仓库?
- 你可以使用
maven-deploy-plugin的goal来指定特定的仓库和快照仓库。 - 示例:
mvn deploy -DaltDeploymentRepository=custom-id::default::http://custom-repo.com/path
- 你可以使用
-
使用部署插件 对于一些高级需求(如跳过测试、跳过部署等),你可以显式地调用
maven-deploy-plugin:# 跳过测试进行部署 mvn deploy -DskipTests # 跳过所有测试生命周期阶段(包括编译和运行测试)进行部署 mvn deploy -Dmaven.test.skip=true # 仅部署,不执行任何其他生命周期阶段(非常不推荐,除非你确定所有文件都已生成) mvn deploy-only:deploy-only
-
安全凭证管理
- 最佳实践:不要将真实的用户名密码直接硬编码在
settings.xml中,尤其是在共享代码库时。 - 推荐做法:
- CI/CD 环境:在 Jenkins, GitLab CI, GitHub Actions 等工具中,使用其提供的 Secret Management 功能来存储密码,然后在构建时通过环境变量注入。
- 命令行:可以使用
-D参数临时传递密码(不安全,仅用于临时调试):mvn deploy -Dusername=myuser -Dpassword=mypwd。 - 加密:可以使用 Maven 的
encrypt-master功能对settings.xml中的密码进行加密。
- 最佳实践:不要将真实的用户名密码直接硬编码在
| 命令 | 作用 | 关键配置文件 |
|---|---|---|
mvn deploy |
将项目构件部署到远程仓库 | pom.xml (定义仓库地址), settings.xml (定义认证信息) |
理解 pom.xml 中 <distributionManagement> 和 settings.xml 中 <servers> 的对应关系是成功使用 deploy 命令的核心。
