Maven 核心概念及生命周期
一、核心概念
1、简介
Maven 是 Apache 基金会旗下的一个纯 Java 开发的开源项目。Maven 是一个项目管理工具,可以对 Java 项目进行构建、解决打包依赖等。它为开发者提供了一套完整的构建生命周期框架,开发团队很容易地就能够自动完成工程的基础构建配置,在有多个开发团队环境的情况下,Maven 能够在很短的时间内使得每项工作都按照标准进行,那是因为大部分的工程配置操作都非常简单并且可复用。
2、POM(Project Object Model,项目对象模型)
Maven 基于项目对象模型 POM(project object model)实现项目管理,POM 即一段描述信息(配置)可以用来管理项目的构建,因此每个 Maven 项目都有一个 pom.xml 文件,且可以通过继承(parent)复用其他 POM 的配置。
POM 是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等,在执行任务或目标时,Maven 会在当前目录中查找 pom 文件,通过读取 pom 文件获取所需的配置信息,然后执行目标。
3、坐标(Coordinates)
Maven 通过唯一坐标标识一个项目或依赖,确保在仓库中准确定位资源。坐标由 5 个要素组成(前 3 个为必填):
groupId:组织ID,一般是反写的公司域名com.example,同一个公司的Groupld都是相同的;
artifactId:制器ID,一般是项目名,如 myapp,也是生成包jar/war的名;
version:版本号(如 1.2.3);
packaging:打包类型(默认 jar,可选 war、pom 等);
classifier:附属标识(用于区分同一版本的不同构建,如 sources 表示源码包)。
范例:
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>
4、依赖(Dependency)
项目运行或构建所需的外部库(或其他模块)称为依赖。通过在 pom.xml 的 <dependencies> 标签中配置依赖的坐标,Maven 会自动从仓库(本地 / 远程)下载并引入依赖,无需手动复制 jar 包。
5、生命周期(Lifecycle)
Maven 定义了一套标准化的项目构建流程(生命周期),包含一系列有序的 “阶段(Phase)”,目的是统一不同项目的构建步骤。开发者无需关心具体操作细节,只需调用生命周期的某个阶段,Maven 会自动执行该阶段及之前的所有阶段。
6、插件(Plugin)
Maven 的核心功能由插件实现,插件是生命周期阶段的 “执行者”。每个插件包含多个 “目标(Goal)”,目标绑定到生命周期的特定阶段后,执行该阶段时会触发目标的操作。例如:maven-compiler-plugin 负责编译源代码,maven-surefire-plugin 负责运行测试用例。
二、Maven 生命周期及阶段作用
Maven 有 3 个独立的生命周期,每个生命周期包含一系列阶段,阶段按顺序执行(前一个阶段完成后才会执行下一个)。
1、Clean 生命周期(清理项目)
用于删除上一次构建生成的文件(如 target 目录),包含 3 个阶段:
pre-clean:清理前的准备操作(如备份文件);
clean:删除构建输出目录(核心清理操作);
post-clean:清理后的后续操作(如日志记录)。
2、Default 生命周期(核心构建流程)
最常用的生命周期,涵盖从项目初始化到部署的全流程,关键阶段及作用如下(按执行顺序):
validate:验证项目信息是否完整(如 POM 配置、必要文件是否存在);
compile:将源代码编译为字节码(class 文件),输出到 target/classes;
test:运行单元测试(通过 surefire 插件),不影响打包;
package:将编译后的代码打包为指定格式(如 jar、war),输出到 target 目录;
install:将打包后的文件安装到本地仓库(~/.m2/repository),供本地其他项目依赖;
deploy:将打包后的文件部署到远程仓库,供团队其他成员使用。
3、Site 生命周期(生成项目站点)
用于生成项目文档(如 API 文档、说明文档),包含 4 个阶段:
pre-site:生成站点前的准备;
site:生成站点文档(如 index.html);
post-site:生成后的优化(如检查链接);
site-deploy:将站点部署到服务器(如 Apache 服务器)。
三、依赖传递原则及冲突解决
依赖传递原则
Maven 依赖具有传递性:若 A 依赖 B,B 依赖 C,则 A 会间接依赖 C(C 称为 A 的 “传递依赖”)。传递时遵循以下原则:
最短路径优先:直接依赖的优先级高于间接依赖。例如:A 直接依赖 C(路径长度 1);A 依赖 B,B 依赖 C(路径长度 2);则 A 最终使用直接依赖的 C。
声明顺序优先:当依赖路径长度相同时,pom.xml 中先声明的依赖被优先使用。例如:A 依赖 B1 和 B2,且 B1 和 B2 都依赖 C(路径长度均为 2);则 A 会使用 B1 依赖的 C(若 B1 在 B2 之前声明)。
依赖冲突解决
依赖冲突指多个传递依赖中出现同一库的不同版本,导致类冲突或功能异常。解决方法如下:
直接声明依赖:通过 “最短路径优先” 原则,在 pom.xml 中直接声明冲突依赖的目标版本,覆盖传递依赖。
排除传递依赖:在依赖配置中通过 <exclusions> 排除不需要的传递依赖。
锁定版本:在父 POM 或当前 POM 中用 <dependencyManagement> 统一管理依赖版本,子项目继承后无需重复声明版本,避免冲突。