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 表示源码包)。

范例:

bash 复制代码
<!-- 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> 统一管理依赖版本,子项目继承后无需重复声明版本,避免冲突。

相关推荐
.柒宇.11 分钟前
力扣hoT100之找到字符串中所有字母异位词(java版)
java·数据结构·算法·leetcode
拂晓银砾1 小时前
Java 连接数据库
java
青衫码上行1 小时前
【Java Web学习 | 第九篇】JavaScript(3) 数组+函数
java·开发语言·前端·javascript·学习
浮游本尊1 小时前
Java学习第29天 - 企业级系统架构与实战
java
程序猿DD1 小时前
探索 Java 中的新 HTTP 客户端
java·后端
m0_495562781 小时前
Swift-Enum
java·算法·swift
姓蔡小朋友1 小时前
Redis:Feed流、SortedSet实现点赞人排序、SortedSet滚动分页
java
青山的青衫1 小时前
【前后缀】Leetcode hot 100
java·算法·leetcode
q***46521 小时前
基于SpringBoot和PostGIS的各省与地级市空间距离分析
java·spring boot·spring
狂团商城小师妹1 小时前
JAVA国际版同城服务同城信息同城任务发布平台APP源码Android + IOS
android·java·ios