Maven 的三个生命周期
在深入命令之前,你需要理解 Maven 的三个核心生命周期,当你执行一个命令时,Maven 实际上是在运行一个或多个生命周期阶段。

-
default(默认) 生命周期: 这是最常用的生命周期,用于处理项目的源代码、编译、测试、打包、部署等,我们接下来介绍的大部分命令都属于这个生命周期。validate: 检查项目是否正确。compile: 编译项目的源代码。test: 运行单元测试。package: 打包项目,生成 JAR 或 WAR 文件。verify: 运行集成测试,检查包是否有效。install: 将包安装到本地 Maven 仓库,供其他项目引用。deploy: 将最终的包部署到远程仓库,供其他开发者使用。
-
clean生命周期: 用于清理项目,它会删除之前构建生成的所有文件(如target目录)。clean: 清理target目录。
-
site生命周期: 用于生成项目文档站点。site: 生成项目站点。
重要提示: Maven 的生命周期是阶段化的,当你运行一个阶段时,它会自动执行该阶段之前的所有阶段。
当你运行 mvn package 时,Maven 会按顺序自动执行 validate, compile, test,最后才是 package。

前提条件
在开始之前,请确保你的系统已经安装并配置好了以下环境:
- Java Development Kit (JDK): Maven 是用 Java 写的,所以需要 JDK,推荐使用 JDK 8 或更高版本。
- Maven: 已安装 Maven 并将其
bin目录添加到系统的PATH环境变量中。
验证安装: 打开终端或命令提示符,输入以下命令:
java -version mvn -version
如果都显示版本信息,说明环境配置正确。
常用 Maven 构建命令
假设你的项目根目录下有一个 pom.xml 文件。

创建新项目
这是构建的第一步,Maven 提供了一个强大的 archetype 插件来快速生成项目骨架。
# 创建一个简单的 Java 应用项目 # -DgroupId: 组织 ID,通常为域名的倒序 # -DartifactId: 项目名称 # -DarchetypeArtifactId: 使用哪种项目模板 # -DinteractiveMode: 是否交互式(设为 false 可自动填写) mvn archetype:generate -DgroupId=com.example -DartifactId=my-first-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
执行后,Maven 会在当前目录下创建一个名为 my-first-app 的新项目文件夹,其中包含了标准的目录结构和 pom.xml 文件。
清理项目
在每次新的构建之前,最好先清理一下,确保是“干净”的构建。
# 执行 clean 生命周期 mvn clean
效果: 删除项目根目录下的 target 文件夹及其所有内容。
编译项目
将 src/main/java 目录下的 Java 源代码编译成 .class 文件,并存放在 target/classes 目录中。
# 执行 compile 阶段 mvn compile
效果: 生成 target/classes 目录。
运行测试
编译并运行 src/test/java 目录下的单元测试。
# 执行 test 阶段 mvn test
效果: 编译代码,运行所有测试,并在 target/surefire-reports 目录中生成测试报告。
打包项目
编译代码、运行测试,然后将项目打包成一个可分发的文件(通常是 JAR 或 WAR)。
# 执行 package 阶段 mvn package
效果: 在 target 目录下生成最终的包文件,my-first-app-1.0-SNAPSHOT.jar。
安装项目到本地仓库
将打包好的 JAR 文件安装到你本地的 Maven 仓库中(通常是 ~/.m2/repository),这样,你电脑上的其他 Maven 项目就可以直接引用这个项目,而无需从远程仓库下载。
# 执行 install 阶段 mvn install
效果: 完成编译、测试、打包,并将最终的 JAR 文件复制到你的本地 Maven 仓库。
跳过测试
在某些情况下(在持续集成环境中快速构建),你可能想跳过测试以节省时间。
# 方法一:在命令后添加 -DskipTests mvn package -DskipTests # 方法二:使用更严格的 -Dmaven.test.skip=true (会跳过编译和运行测试) mvn package -Dmaven.test.skip=true
推荐使用 -DskipTests,因为它仍然会编译测试代码,只是不运行它们,这有助于发现代码中的编译错误。
跳过清理
默认情况下,mvn install 会先执行 clean,如果你知道 target 目录是干净的,可以跳过这一步以加快速度。
# 使用 -- 或 ! 来跳过生命周期 mvn install --! # 或者 mvn !clean install
编译测试代码
如果你想只编译测试代码而不运行它们。
mvn test-compile
生成项目站点
根据 pom.xml 中的信息和代码注释,生成项目文档。
mvn site
效果: 在 target/site 目录下生成一个包含项目报告、依赖信息等内容的 HTML 网站。
完整的构建工作流
一个完整的、标准的构建流程如下:
# 1. 清理之前的构建 mvn clean # 2. 编译、测试、打包,并安装到本地仓库 mvn install
这个命令组合会确保你的项目从一个干净的状态开始,经过完整的验证流程,最终成为一个可供本地其他项目使用的组件。
高级选项和常见场景
指定 Maven 配置文件
Maven 允许你根据不同的环境(开发、测试、生产)定义不同的配置(如数据库连接、依赖版本等),这些配置在 pom.xml 中通过 <profiles> 定义。
# 构建时激活名为 "production" 的 profile mvn clean install -P production
查看依赖树
当你想查看项目引入的所有依赖及其传递依赖时,这个命令非常有用。
mvn dependency:tree
效果: 在控制台打印出项目的完整依赖树。
下载源码和 Javadoc
在 IDE(如 IntelliJ IDEA 或 Eclipse)中查看源码和 Javadoc 会非常方便,你可以通过 Maven 命令提前下载它们。
# 下载所有依赖的源码 mvn dependency:sources # 下载所有依赖的 Javadoc mvn dependency:resolve -Dclassifier=javadoc
使用自定义的 settings.xml
如果你的 Maven 配置(如远程仓库、认证信息)存储在非默认位置的 settings.xml 文件中,可以这样指定:
mvn clean install -s /path/to/your/custom-settings.xml
强制更新依赖
有时,依赖仓库中的版本更新了,但本地缓存的还是旧版本,可以使用 -U 参数强制 Maven 检查并更新所有依赖。
mvn clean install -U
常见问题排查
mvn command not found
- 原因: Maven 的
bin目录没有添加到系统的PATH环境变量中。 - 解决: 根据你的操作系统(Windows, macOS, Linux)正确配置
PATH环境变量,然后重新打开终端。
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project my-first-app: Compilation failure
- 原因: 代码中有语法错误。
- 解决: 根据错误提示信息,找到并修复
src/main/java目录下对应的 Java 文件中的代码问题。
Could not resolve dependencies for project ...
- 原因:
- 网络问题,无法连接到 Maven 中央仓库或其他远程仓库。
pom.xml中的依赖坐标(groupId, artifactId, version)写错。- 公司使用了私有代理仓库,但配置不正确。
- 解决:
- 检查网络连接。
- 仔细核对
pom.xml中的依赖信息。 - 检查
~/.m2/settings.xml文件中的仓库配置。
| 命令 | 描述 | 执行的生命周期阶段 |
|---|---|---|
mvn archetype:generate |
创建新项目 | Archetype |
mvn clean |
清理 target 目录 |
clean |
mvn compile |
编译源代码 | validate, compile |
mvn test |
编译并运行测试 | validate, compile, test |
mvn package |
打包项目(生成 JAR/WAR) | validate, compile, test, package |
mvn install |
安装到本地仓库 | validate, compile, test, package, install |
mvn deploy |
部署到远程仓库 | ...package, install, deploy |
mvn site |
生成项目站点 | site |
mvn clean install |
最常用的完整构建流程 | clean, default (直到 install) |
熟练掌握这些命令,将极大地提高你的 Java 项目开发效率,祝你编码愉快!
