目录
[1. 项目对象模型(POM)](#1. 项目对象模型(POM))
[3. 依赖管理](#3. 依赖管理)
Maven简介
为什么要用Maven?
现在的JAVA开发,有大量的第三方框架和工具可以供我们使用。
在没有Maven之前,想要使用jar包,常见方法就是复制粘贴到 WEB-INF/lib 目录下。但是每次创建一个新的工程就需要将 jar 包重复复制到 lib 目录下,从而造成工作区中存在大量重复的文件。其二,jar包之间一般会存在依赖关系,而我们拿到一个新的jar包可能不清楚其中的依赖关系,导致依赖不够、程序无法运行,且大型项目中存在大量jar包,如需手动逐一确认每个jar包的依赖,会耗费巨大精力和时间。其三,java开发依赖的jar包种类繁多,下载地址不同,搜索不便,还可能找到同名但不是你想要的jar包。
使用了Maven之后,每个 jar 包只在本地仓库中保存一份,需要 jar 包的工程只需要以坐标的方式引用即可,避免了大量的重复文件。引入 Maven 后,Maven 就可以替我们自动的将当前 jar 包所依赖的其他所有 jar 包全部导入进来, 无需人工参与,节约了我们大量的时间和精力。使用 Maven 我们可以享受到一个完全统一规范的 jar 包管理体系,只需要在你的项目中以坐标的方式依赖一个 jar 包,Maven 就会自动从中央仓库进行下载,并同时下载这个 jar 包所依赖的其他 jar 包。
什么是Maven?
Maven 是 Apache 软件基金会开发的一款基于项目对象模型(POM)理念的 Java 项目管理与构建自动化工具。它借助一个中央配置文件(pom.xml
),能够对项目的构建、报告以及文档等全过程进行有效管理。作为 Java 生态系统的核心工具之一,Maven 通过标准化的项目结构和生命周期,解决了软件开发中依赖管理和构建流程复杂的问题。
Maven的下载和安装
1、下载地址:Maven -- Introduction
2、下载后解压maven安装包,放在一个非中文无空格的文件夹中
3、配置maven的相关环境变量
新增环境变量名:MAVEN_HOME;
变量值为安装目录bin目录的上一级目录;
编辑Path,新增 %MAVEN_HOME%\bin
4、验证是否安装成功
运行 mvn -v 命令查看maven的版本
XML
C:\Users\Administrator>mvn -v
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:1
4+08:00)
Maven home: E:\Program Files\maven3.5.4\apache-maven-3.5.4\bin\..
Java version: 1.8.0_25, vendor: Oracle Corporation, runtime: E:\Program Files\ja
va1.8\jdk1.8\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
核心概念
1. 项目对象模型(POM)
-
定义 :项目的核心配置文件
pom.xml
,以 XML 格式呈现,对项目的基本信息(像项目名称、版本、组织等)、依赖关系、插件以及构建流程等方面进行描述。 -
关键元素 :
XML<project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <!-- 项目组织标识 --> <artifactId>my-project</artifactId> <!-- 项目唯一标识 --> <version>1.0.0</version> <!-- 项目版本 --> <dependencies>...</dependencies> <!-- 依赖管理 --> <build>...</build> <!-- 构建配置 --> </project>
2.坐标
在 Maven 中,坐标(Coordinates)是用于唯一标识和定位构件(Artifacts)的一组元数据。通过坐标,Maven 可以精确地从仓库中查找和获取项目所需的依赖。
-
groupId
-
含义 :项目组织的唯一标识,通常是公司或组织的域名倒序(如
com.example
)。 -
作用:区分不同组织或公司的项目。
-
示例 :
org.springframework
、com.google.guava
。
-
-
artifactId
-
含义:项目中的模块或构件名称,通常是项目名称或子模块名称。
-
作用:区分同一组织下的不同项目。
-
示例 :
spring-core
、guava
。
-
-
version
-
含义 :项目的版本号,遵循语义化版本规则(如
1.0.0
、2.5.3.RELEASE
)。 -
作用:区分同一项目的不同迭代版本。
-
示例 :
5.3.18
、31.1-jre
。
-
完整坐标示例:
XML
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.18</version>
</dependency>
3. 依赖管理
Maven 通过中央仓库(如 Maven Central)自动下载项目所需的依赖库,避免手动管理 JAR 包的麻烦。
-
依赖声明示例 :
XML<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.18</version> </dependency> </dependencies>
4.仓库
仓库在依赖管理和项目构建中扮演着至关重要的角色。Maven 通过仓库来存储和检索项目所需的所有构件(如 JAR 包、WAR 包、插件等),是实现依赖自动化的基础。当我们在pom.xml
中声明一个依赖时,Maven 会自动从仓库中查找并下载对应的构件。
Maven 的仓库系统采用三层结构:
-
本地仓库 (Local Repository):开发机上的缓存目录(默认
~/.m2/repository,可自己配置
),避免重复下载,如果我们本地项目需要某个jar包,优先去本地仓库去找依赖。 -
远程仓库(Remote Repository):如中央仓库(Maven Central)、第三方仓库(如 Spring 的仓库)。
-
私服(Nexus/Artifactory):企业内部的私有仓库,加速下载并托管自研构件。
三种仓库的关系:
Maven 的仓库系统采用三级缓存架构 ,依赖查找顺序为:本地仓库 → 私服 → 中央仓库(或其他远程仓库)。
仓库配置方法:
1. 本地仓库配置
按路径找到maven/conf/settings.xml,编辑 localRepository 自定义本地仓库路径:
XML
<settings>
<localRepository>/path/to/your/local/repo</localRepository>
</settings>
2. 私服配置(镜像)
按路径找到maven/conf/settings.xml,通过镜像(Mirror配置将所有远程仓库请求重定向到私服:
XML
<settings>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf> <!-- 匹配所有远程仓库 -->
<url>http://nexus.example.com/repository/maven-public</url>
</mirror>
</mirrors>
</settings>
5.生命周期
三大生命周期体系
Maven 定义了 3 个独立且并行的生命周期 ,每个生命周期包含多个 阶段(Phase),阶段按顺序执行:
-
Clean Lifecycle
清理项目构建生成的文件,主要阶段:
pre-clean → clean → post-clean
-
Default Lifecycle
核心构建流程,从编译到部署的完整过程,包含约 20 个阶段(最常用)
validate → initialize → generate-sources → process-sources → compile → process-classes → generate-test-sources → process-test-sources → test-compile → process-test-classes → test → prepare-package → package → pre-integration-test → integration-test → post-integration-test → verify → install → deploy
-
Site Lifecycle
生成项目文档和报告,主要阶段:
pre-site → site → post-site → site-deploy
执行某个阶段时,Maven 会自动触发该阶段及其之前的所有阶段。
Default Lifecycle 关键阶段详解
- 编译阶段
-
validate
:验证项目配置是否正确(如 POM 格式、必填字段)。 -
generate-sources
:生成源代码(如从模板或注解处理器生成)。 -
compile
:编译主代码(src/main/java
)。 -
process-classes
:处理编译后的类文件(如字节码增强)。
- 测试阶段
-
generate-test-sources
:生成测试源代码。 -
test-compile
:编译测试代码(src/test/java
)。 -
test
:使用测试框架(如 JUnit)执行单元测试(不生成测试报告)。
- 打包阶段
-
package
:将编译后的代码打包为 JAR/WAR/EAR 等格式。 -
verify
:执行集成测试和验证(如检查代码覆盖率、静态分析)。
- 安装 / 部署阶段
-
install
:将打包后的文件安装到本地仓库(~/.m2/repository
)。 -
deploy
:将打包后的文件发布到远程仓库(如公司私服)。
Maven工作机制
当执行 Maven 命令(如mvn package
)时,其内部处理流程如下:
-
解析 POM 文件
-
从当前目录读取
pom.xml
,递归解析父 POM(通过<parent>
标签)和模块依赖。 -
合并所有 POM 配置,形成完整的项目模型。
-
-
确定生命周期阶段
- 根据命令(如
package
)确定目标阶段,并触发该阶段及之前的所有阶段(如validate → compile → test → package
)。
- 根据命令(如
-
插件绑定与执行
-
为每个阶段查找绑定的插件(默认或自定义配置)。
-
按顺序执行插件的目标(Goal),完成具体任务(如编译、测试、打包)。
-
-
依赖解析
-
根据
pom.xml
中的<dependencies>
声明,从本地仓库查找依赖。 -
若本地缺失,从远程仓库(或私服)下载并缓存到本地。
-
-
执行构建任务
- 插件按配置执行具体操作,生成结果(如 JAR 包、WAR 包)。
常用命令
|---------------|-------------------|
| 命令 | 作用 |
| mvn clean
| 删除构建产物(target 目录) |
| mvn compile
| 编译主代码 |
| mvn test
| 编译并执行测试 |
| mvn package
| 打包(JAR/WAR) |
| mvn install
| 安装到本地仓库 |
| mvn deploy
| 部署到远程仓库 |