1.3 Maven 常用命令 1.3 Maven 常用命令 1.3.1 Maven 生命周期与命令概览 在深入具体命令之前,理解 Maven 的生命周期至关重要。Maven 生命周期定义了项目构建的各个阶段,而 Maven 命令则用于触发这些生命周期阶段的执行。 Maven 主要有三大内置生命周期: clean 生命周期: 用于清理项目,移除之前构建生成的文件。 default (build) 生命周期: 这是最核心的生命周期,涵盖了项目构建、测试、打包、安装和部署等环节。 site 生命周期: 用于生成项目站点文档。 每个生命周期又包含一系列有序的阶段(Phase)。例如, 生命周期包含 , , , , , 等阶段。
在深入具体命令之前,理解 Maven 的生命周期至关重要。Maven 生命周期定义了项目构建的各个阶段,而 Maven 命令则用于触发这些生命周期阶段的执行。
Maven 主要有三大内置生命周期:
clean 生命周期: 用于清理项目,移除之前构建生成的文件。
default (build) 生命周期: 这是最核心的生命周期,涵盖了项目构建、测试、打包、安装和部署等环节。
site 生命周期: 用于生成项目站点文档。
每个生命周期又包含一系列有序的阶段(Phase)。例如,default 生命周期包含 validate, compile, test, package, install, deploy 等阶段。当我们执行一个 Maven 命令时,实际上是触发了特定生命周期阶段的执行,同时也会顺序执行该阶段之前的所有阶段。
以下 Mermaid 图展示了 default 生命周期中一些关键阶段的顺序关系:
常用 Maven 命令速查表:
| 命令 | 描述 | 生命周期/阶段 | 常用场景 |
|---|---|---|---|
mvn clean |
清理项目,删除 target 目录 |
clean | 在构建之前清理旧的构建产物,确保构建环境的干净 |
mvn compile |
编译项目的源代码 | default | 将 src/main/java 目录下的 Java 源代码编译成 .class 文件,输出到 target/classes 目录 |
mvn test-compile |
编译项目的测试源代码 | default | 将 src/test/java 目录下的 Java 测试源代码编译成 .class 文件,输出到 target/test-classes 目录 |
mvn test |
执行项目的单元测试 | default | 运行 src/test/java 目录下的单元测试用例,生成测试报告 |
mvn package |
打包项目,根据 pom.xml 中定义的打包类型(如 jar, war, pom)生成相应的包文件到 target 目录 |
default | 将项目打包成可发布的格式,例如生成 JAR 包、WAR 包等 |
mvn install |
将项目安装到本地 Maven 仓库 | default | 将打包好的项目安装到本地 Maven 仓库 (~/.m2/repository),供本地其他 Maven 项目依赖使用 |
mvn deploy |
将项目部署到远程 Maven 仓库 | default | 将打包好的项目部署到远程 Maven 仓库(如 Nexus, Artifactory),供团队或组织共享 |
mvn site |
生成项目站点文档 | site | 根据项目信息和配置生成项目站点文档,通常包含项目报告、依赖关系、项目信息等 |
mvn validate |
验证项目是否正确以及所有必要的资源是否可用 | default | 检查 pom.xml 文件是否有效,以及项目环境是否满足构建要求 |
mvn verify |
运行任何检查,验证包是否有效且达到质量标准 | default | 在集成测试之后,进行更深入的检查,例如代码质量检查、安全漏洞扫描等,确保项目达到发布的质量标准 |
mvn dependency:tree |
查看项目的依赖树 | - | 以树形结构展示项目的依赖关系,帮助分析和管理项目依赖 |
mvn help:effective-pom |
查看 Maven 解析后的有效 pom.xml |
- | 展示经过 Maven 继承、配置和 Profile 等处理后最终生效的 pom.xml 内容,用于诊断配置问题 |
mvn archetype:generate |
使用 Archetype 生成项目骨架 | - | 基于 Maven Archetype 模板快速创建新的 Maven 项目,例如 Webapp 项目、Quickstart 项目等 |
mvn -v 或 mvn --version |
查看 Maven 版本信息 | - | 检查 Maven 安装是否成功,以及查看当前使用的 Maven 版本 |
mvn -h 或 mvn --help |
查看 Maven 帮助信息 | - | 获取 Maven 命令行的帮助信息,查看可用选项和命令 |
接下来,我们将逐个详细讲解这些常用命令,并通过代码实践加深理解。
mvn clean 命令详解与实践mvn clean 命令用于清理项目构建的产物。它会删除项目根目录下 target 目录及其所有内容。target 目录是 Maven 默认的构建输出目录,包含了编译后的 .class 文件、打包后的 jar/war 包、测试报告等所有构建生成的文件。
命令格式:
mvn clean
实践案例:
创建一个简单的 Maven 项目 (quickstart archetype):
mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false cd my-app
编译项目:
mvn compile
执行 mvn compile 后,会在项目根目录下生成 target 目录,其中包含 classes 目录,存放编译后的 .class 文件。
执行 mvn clean 命令:
mvn clean
执行 mvn clean 后,再次查看项目根目录,会发现 target 目录已经被删除。
内容详解:
作用: mvn clean 命令的核心作用是清理构建环境,确保下一次构建是从一个干净的状态开始。
使用场景:
构建之前: 在开始新的构建之前,通常建议先执行 mvn clean,以移除之前构建产生的旧文件,避免旧文件干扰新的构建。
解决构建问题: 当项目构建出现错误或异常时,有时清理 target 目录可以解决一些由于旧文件导致的奇怪问题。
切换分支或环境: 在 Git 分支切换或者环境切换后,执行 mvn clean 可以确保项目构建环境与当前分支或环境一致。
注意事项: mvn clean 命令会删除 target 目录下的所有内容,包括构建产物、测试报告等,执行前请确认是否需要保留这些文件。
mvn compile 命令详解与实践mvn compile 命令用于编译项目的源代码。它会将 src/main/java 目录下的 Java 源代码编译成 .class 字节码文件,并输出到 target/classes 目录。
命令格式:
mvn compile
实践案例 (继续使用 my-app 项目):
确保项目已经创建并进入项目目录 (my-app)。
查看 src/main/java/com/example/App.java 文件,确认存在 Java 源代码。
执行 mvn compile 命令:
mvn compile
查看 target/classes 目录,确认是否生成 com/example/App.class 文件。
内容详解:
作用: mvn compile 命令是 Maven 构建生命周期中的核心阶段之一,负责将 Java 源代码转换成 JVM 可以执行的字节码。
工作原理: Maven 编译器插件 (maven-compiler-plugin) 负责执行编译任务。插件会读取 pom.xml 文件中配置的编译参数(如 JDK 版本、编码方式等),并使用 Java 编译器 (javac) 编译源代码。
依赖关系: mvn compile 命令依赖于 validate 阶段。在执行 compile 之前,Maven 会先执行 validate 阶段,验证 pom.xml 文件是否有效。
输出目录: 编译后的 .class 文件默认输出到 target/classes 目录。
使用场景:
开发阶段: 在编写代码过程中,经常需要执行 mvn compile 来检查代码是否编译通过,以及尽早发现编译错误。
构建流程: mvn compile 是构建流程中不可或缺的一步,为后续的测试、打包等阶段提供基础。
mvn test-compile 和 mvn test 命令详解与实践mvn test-compile 和 mvn test 命令分别用于编译测试源代码和执行单元测试。
mvn test-compile 命令:
作用: 编译 src/test/java 目录下的测试源代码,生成测试类的 .class 文件,输出到 target/test-classes 目录。
命令格式:
mvn test-compile
mvn test 命令:
作用: 执行单元测试。默认情况下,Maven 使用 Surefire 插件来运行测试用例,并生成测试报告。测试用例通常位于 src/test/java 目录下。
命令格式:
mvn test
实践案例 (继续使用 my-app 项目,添加测试用例):
在 src/test/java/com/example 目录下创建 AppTest.java 文件,添加一个简单的测试用例 (使用 JUnit):
package com.example; import org.junit.Test; import static org.junit.Assert.assertTrue; public class AppTest { @Test public void shouldAnswerWithTrue() { assertTrue(true); } }
执行 mvn test-compile 命令:
mvn test-compile
查看 target/test-classes 目录,确认是否生成 com/example/AppTest.class 文件。
执行 mvn test 命令:
mvn test
查看控制台输出,应该看到测试用例执行结果 (例如 "Tests run: 1, Failures: 0, Errors: 0, Skipped: 0")。同时,在 target/surefire-reports 目录下会生成测试报告文件 (XML 和文本格式)。
内容详解:
mvn test-compile:
为单元测试的执行做准备,编译测试代码。
与 mvn compile 类似,但作用于测试源代码目录。
mvn test:
自动查找并执行 src/test/java 目录下的测试用例。
默认使用 JUnit 或 TestNG 等测试框架。
生成详细的测试报告,包括测试用例执行结果、耗时、错误信息等。
测试失败会使构建失败。
使用场景:
保证代码质量: 单元测试是保证代码质量的重要手段,通过 mvn test 命令可以方便地运行所有单元测试,及时发现代码缺陷。
持续集成/持续交付 (CI/CD): 在 CI/CD 流程中,mvn test 通常是构建流水线中的一个关键步骤,确保每次代码提交都经过自动化测试。
mvn package 命令详解与实践mvn package 命令用于将项目打包成可发布的格式。具体的打包类型由 pom.xml 文件中的 <packaging> 元素定义,常见的打包类型包括 jar, war, pom 等。打包后的文件会生成在 target 目录下。
命令格式:
mvn package
实践案例 (继续使用 my-app 项目,打包成 JAR 包):
确认 pom.xml 文件中的 <packaging> 元素为 jar (默认 quickstart archetype 就是 jar)。
执行 mvn package 命令:
mvn package
查看 target 目录,确认是否生成 my-app-1.0-SNAPSHOT.jar 文件 (版本号可能不同)。
内容详解:
作用: mvn package 命令将编译、测试后的项目代码和资源文件打包成指定格式的归档文件,例如 JAR 包、WAR 包、POM 文件等。
打包类型 <packaging>:
jar: 用于打包 Java 类库或独立的 Java 应用程序。
war: 用于打包 Web 应用程序,通常包含 JSP、Servlet、HTML、JS 等 Web 资源。
pom: 用于打包 Maven 项目的 POM 文件,通常用于父模块或聚合模块。
打包过程: mvn package 命令会执行 default 生命周期中 package 阶段之前的所有阶段 (包括 compile, test 等)。
输出文件: 打包后的文件默认输出到 target 目录,文件名通常包含 artifactId, version 和 packaging 类型。
使用场景:
发布 Java 类库: 将 Java 类库打包成 JAR 包,方便其他项目引用。
部署 Web 应用程序: 将 Web 应用程序打包成 WAR 包,部署到 Web 服务器 (如 Tomcat, Jetty)。
构建父模块/聚合模块: 将 Maven 项目的 POM 文件打包成 POM 文件,用于构建父模块或聚合模块。
mvn install 命令详解与实践mvn install 命令用于将项目安装到本地 Maven 仓库 (~/.m2/repository)。本地仓库用于存储项目构建的构件 (Artifacts),包括 JAR 包、POM 文件等。安装到本地仓库后,其他本地 Maven 项目就可以依赖这个项目。
命令格式:
mvn install
实践案例 (继续使用 my-app 项目):
先执行 mvn package 命令,确保项目已经打包。
执行 mvn install 命令:
mvn install
查看本地 Maven 仓库 (~/.m2/repository),确认是否生成 com/example/my-app/1.0-SNAPSHOT 目录,并包含 my-app-1.0-SNAPSHOT.jar 和 my-app-1.0-SNAPSHOT.pom 文件。
内容详解:
作用: mvn install 命令将打包好的项目构件 (JAR 包、POM 文件等) 安装到本地 Maven 仓库,使其可以被本地其他 Maven 项目引用。
本地仓库: 本地 Maven 仓库默认位于用户主目录下的 .m2/repository 目录。
安装过程: mvn install 命令会执行 default 生命周期中 install 阶段之前的所有阶段 (包括 compile, test, package 等)。
构件坐标: 安装到本地仓库的构件会根据其 Maven 坐标 (groupId, artifactId, version) 组织目录结构。
使用场景:
本地项目依赖: 当一个 Maven 项目需要依赖另一个本地 Maven 项目时,需要先将被依赖的项目安装到本地仓库。
开发阶段: 在本地开发和测试阶段,可以使用 mvn install 将当前模块安装到本地仓库,供其他模块依赖测试。
mvn deploy 命令详解与实践mvn deploy 命令用于将项目部署到远程 Maven 仓库。远程仓库通常是团队或组织共享的仓库,例如 Nexus, Artifactory 等。部署到远程仓库后,其他团队成员或项目就可以通过 Maven 依赖管理使用这个项目。
命令格式:
mvn deploy
配置远程仓库:
要使用 mvn deploy 命令,需要在 pom.xml 文件中配置远程仓库信息。通常需要在 <distributionManagement> 元素中配置 <repository> (发布仓库) 和 <snapshotRepository> (快照版本仓库)。
示例 pom.xml 配置:
<distributionManagement> <repository> <id>releases</id> <name>Releases Repository</name> <url>http://your-remote-repo/repository/maven-releases/</url> </repository> <snapshotRepository> <id>snapshots</id> <name>Snapshots Repository</name> <url>http://your-remote-repo/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
实践案例 (假设已配置远程仓库):
确保 pom.xml 文件中已经配置了 <distributionManagement> 元素,并配置了正确的远程仓库 URL 和认证信息 (如果需要)。
执行 mvn deploy 命令:
mvn deploy
登录远程 Maven 仓库管理界面,确认是否成功部署了项目构件。
内容详解:
作用: mvn deploy 命令将打包好的项目构件 (JAR 包、POM 文件等) 部署到远程 Maven 仓库,使其可以被团队或组织内的其他项目共享和依赖。
远程仓库: 远程 Maven 仓库用于集中管理和共享 Maven 构件,常见的远程仓库管理工具包括 Nexus, Artifactory 等。
部署过程: mvn deploy 命令会执行 default 生命周期中 deploy 阶段之前的所有阶段 (包括 compile, test, package, install 等)。
仓库类型: 通常会配置两种类型的远程仓库:
Release 仓库: 用于发布正式版本 (Release 版本) 的构件。
Snapshot 仓库: 用于发布快照版本 (Snapshot 版本) 的构件。
认证: 部署到远程仓库通常需要认证,需要在 Maven settings.xml 文件中配置仓库认证信息 (用户名和密码)。
使用场景:
团队协作: 将项目构件部署到远程仓库,方便团队成员共享和复用代码。
企业级软件发布: 将企业内部的组件或服务发布到远程仓库,供企业内部其他项目使用。
开源项目发布: 将开源项目发布到公共 Maven 仓库 (如 Maven Central),供全球开发者使用。
mvn site 命令详解与实践mvn site 命令用于生成项目站点文档。Maven Site 插件可以根据项目信息、源代码、测试报告等生成包含项目文档、报告、依赖关系等信息的 HTML 站点。
命令格式:
mvn site
实践案例 (继续使用 my-app 项目):
执行 mvn site 命令:
mvn site
查看 target/site 目录,会生成 HTML 站点文件,包括 index.html 等。
使用浏览器打开 target/site/index.html 文件,查看生成的项目站点文档。
内容详解:
作用: mvn site 命令生成项目站点文档,提供项目信息、报告、依赖关系等可视化展示。
Maven Site 插件: Maven Site 插件负责生成站点文档,可以自定义站点外观和内容。
站点内容: 默认生成的站点文档通常包含以下内容:
项目信息: 项目名称、描述、版本、开发者信息等。
项目报告: 测试报告 (Surefire 报告)、代码覆盖率报告 (Jacoco 报告)、代码质量报告 (Checkstyle 报告、PMD 报告) 等。
依赖关系: 项目依赖树、依赖分析报告等。
项目文档: 项目 README 文件、自定义文档等。
使用场景:
项目文档化: 为项目生成统一格式的站点文档,方便团队成员和用户了解项目信息。
项目报告展示: 将项目构建过程中的各种报告集成到站点文档中,方便查看和分析。
团队协作和沟通: 项目站点文档可以作为团队协作和沟通的平台,方便共享项目信息和进展。
mvn validate 和 mvn verify 命令详解mvn validate 和 mvn verify 命令都是 Maven default 生命周期中的阶段,用于验证项目的有效性和质量。
mvn validate 命令:
作用: 验证项目是否正确,以及所有必要的资源是否可用。
执行阶段: default 生命周期中的 validate 阶段。
主要验证内容:
pom.xml 文件是否有效,例如 XML 格式是否正确、必要的元素是否缺失等。
项目环境是否满足构建要求,例如 JDK 版本、Maven 版本等。
使用场景:
在构建流程的早期进行基本验证,尽早发现项目配置或环境问题。
通常在 compile 阶段之前执行。
mvn verify 命令:
作用: 运行任何检查,验证包是否有效且达到质量标准。
执行阶段: default 生命周期中的 verify 阶段。
主要验证内容:
集成测试结果验证。
代码质量检查 (例如通过 Checkstyle, PMD, FindBugs 等插件)。
安全漏洞扫描。
其他自定义的验证逻辑。
使用场景:
在集成测试之后,进行更深入的验证,确保项目达到发布的质量标准。
通常在 install 阶段之前执行。
内容对比:
| 命令 | 验证阶段 | 验证内容 | 目的 |
|---|---|---|---|
mvn validate |
validate | pom.xml 文件有效性,项目环境 |
快速验证项目基本配置和环境,尽早发现问题 |
mvn verify |
verify | 集成测试结果,代码质量,安全漏洞,自定义检查 | 深入验证项目质量,确保项目达到发布标准 |
实践说明:
mvn validate 和 mvn verify 命令通常不需要单独执行,它们会作为 default 生命周期的一部分,在执行其他命令 (如 mvn compile, mvn package, mvn install, mvn deploy) 时自动被执行。
mvn dependency:tree 命令详解与实践mvn dependency:tree 命令用于查看项目的依赖树。它可以以树形结构展示项目的直接依赖和传递依赖,帮助开发者分析和管理项目依赖关系。
命令格式:
mvn dependency:tree
实践案例 (继续使用 my-app 项目,假设添加了 junit 依赖):
确保 pom.xml 文件中已经添加了 junit 依赖:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies>
执行 mvn dependency:tree 命令:
mvn dependency:tree
查看控制台输出,会显示项目的依赖树,例如:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ my-app --- [INFO] com.example:my-app:jar:1.0-SNAPSHOT [INFO] \- junit:junit:jar:4.11:test [INFO] \- org.hamcrest:hamcrest-core:jar:1.3:test
内容详解:
作用: mvn dependency:tree 命令以树形结构展示项目的依赖关系,包括直接依赖和传递依赖。
依赖树结构: 依赖树以项目自身作为根节点,一级子节点为直接依赖,二级子节点为直接依赖的依赖 (传递依赖),以此类推。
依赖范围 (Scope): 依赖树中会显示每个依赖的 Scope (例如 test, compile, runtime 等)。
解决依赖冲突: 通过查看依赖树,可以分析和解决依赖冲突问题。例如,当项目中存在多个版本相同的依赖时,可以通过 <dependencyManagement> 和 <exclusions> 等配置进行管理。
使用场景:
分析项目依赖: 快速了解项目的依赖关系,包括直接依赖和传递依赖。
排查依赖问题: 当项目出现依赖冲突或依赖缺失等问题时,可以使用 mvn dependency:tree 命令分析依赖关系,定位问题所在。
优化项目依赖: 通过分析依赖树,可以识别出不必要的依赖或重复依赖,优化项目依赖配置。
mvn help:effective-pom 命令详解与实践mvn help:effective-pom 命令用于查看 Maven 解析后的有效 pom.xml 文件。由于 Maven 支持 POM 继承、Profile 配置、属性替换等特性,最终生效的 pom.xml 可能与原始 pom.xml 文件有所不同。mvn help:effective-pom 命令可以展示经过 Maven 处理后最终生效的 pom.xml 内容,帮助开发者诊断配置问题。
命令格式:
mvn help:effective-pom
实践案例 (继续使用 my-app 项目,假设父 POM 中定义了一些配置):
假设项目存在父 POM,并在父 POM 中定义了一些插件配置或属性。
在子项目 my-app 目录下执行 mvn help:effective-pom 命令:
mvn help:effective-pom
查看控制台输出,会显示 Maven 解析后的有效 pom.xml 内容,包括从父 POM 继承的配置、Profile 配置、属性替换后的值等。
内容详解:
作用: mvn help:effective-pom 命令展示 Maven 解析后的有效 pom.xml 内容,帮助开发者理解最终生效的 Maven 配置。
有效 POM: 有效 POM 是经过 Maven 继承、Profile 合并、属性替换等处理后最终生效的 pom.xml 文件。
诊断配置问题: 当 Maven 构建行为与预期不符时,可以使用 mvn help:effective-pom 命令查看有效 POM,分析配置是否正确,例如检查 Profile 是否生效、属性值是否正确等。
理解 POM 继承和 Profile: 通过对比原始 pom.xml 和有效 POM,可以更好地理解 Maven POM 继承和 Profile 的工作原理。
使用场景:
诊断 Maven 配置问题: 当 Maven 构建行为异常时,使用 mvn help:effective-pom 命令查看有效 POM,排查配置问题。
理解 POM 继承和 Profile: 学习和理解 Maven POM 继承和 Profile 特性。
确认最终生效的配置: 确认最终生效的 Maven 配置,例如插件版本、属性值等。
mvn archetype:generate 命令详解与实践mvn archetype:generate 命令用于使用 Archetype 生成项目骨架。Maven Archetype 是一种项目模板机制,可以根据预定义的模板快速创建各种类型的 Maven 项目,例如 Webapp 项目、Quickstart 项目、Spring Boot 项目等。
命令格式:
mvn archetype:generate
交互式模式:
执行 mvn archetype:generate 命令后,Maven 会进入交互式模式,提示用户选择 Archetype、输入 groupId, artifactId, version 等项目信息。