一、Maven认识
-
Maven 概述
- 定义:专为 Java 项目打造的标准化管理和构建工具。
- 解决问题:简化依赖包管理、项目目录结构配置、环境配置及命令行编译等琐碎工作。
- 核心功能:提供标准化项目结构、构建流程(编译、测试、打包、发布等)、依赖管理机制。
-
Maven 项目结构
-
标准目录
pom.xml
:项目描述文件,位于根目录。src/main/java
:存放 Java 源码。src/main/resources
:存放主程序资源文件。src/test/java
:存放测试源码。src/test/resources
:存放测试资源文件。target
:存放编译、打包生成的文件。
-
注意事项:需严格遵循标准目录结构,勿随意修改,以便 Maven 正常运行。
-
-
pom.xml 文件解析
-
项目坐标
groupId
:类似 Java 包名,通常为公司或组织名称。artifactId
:类似 Java 类名,通常为项目名称。version
:项目版本号,三者组合唯一标识一个 Maven 工程。
-
依赖声明:通过
<dependency>
标签声明依赖,Maven 自动下载依赖包并添加到 classpath,示例:xml
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>2.0.16</version> </dependency>
-
属性配置
project.build.sourceEncoding
:设置源码字符编码,通常为UTF-8
。maven.compiler.release
:指定 JDK 版本(Java 9 + 推荐),确保源码和编译版本一致,若不一致可分别设置maven.compiler.source
和maven.compiler.target
。
-
-
Maven 安装步骤
-
下载:从 [Maven 官网] 获取最新 3.9.x 版本。
-
环境变量配置
- Linux/macOS:解压后设置
M2_HOME
指向 Maven 目录,将$M2_HOME/bin
添加到PATH
。 - Windows:设置
%M2_HOME%\bin
到系统 Path 变量。
- Linux/macOS:解压后设置
-
验证安装:命令行输入
mvn -version
,若显示版本信息则安装成功,若提示命令未找到需检查环境变量配置。
-
-
总结
- Maven 通过
pom.xml
定义项目,采用预设目录结构,简化依赖管理和构建流程。 - 依赖通过
groupId
、artifactId
、version
唯一定位,支持自动下载。 - 标准化流程提升项目可维护性,适合团队协作和服务器部署
- Maven 通过
二、Maven 核心作用:自动化依赖管理
-
解决依赖痛点
- 无需手动下载、解压第三方 Jar 包,自动处理传递依赖(如项目依赖
abc
,abc
依赖xyz
,Maven 自动导入两者)。 - 示例:声明
spring-boot-starter-web
依赖时,Maven 自动解析并导入其所需的二三十个间接依赖。
- 无需手动下载、解压第三方 Jar 包,自动处理传递依赖(如项目依赖
-
依赖传递图示
graph TD
Sample_Project --> abc --> xyz
1、依赖关系类型(Scope)
Scope | 说明 | 典型示例 |
---|---|---|
compile | 编译时需要(默认) | commons-logging |
test | 仅测试时需要,运行时无需引入 | JUnit |
runtime | 编译时无需,运行时需要 | MySQL 驱动(mysql-connector-java) |
provided | 编译时需要,但运行时由服务器或 JDK 提供(如 Servlet 容器内置) | jakarta.servlet-api |
配置示例:
<!-- test作用域 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
2、Maven 仓库管理
-
中央仓库(Central Repository)
- 官方仓库地址:repo1.maven.org
- 首次下载 Jar 包后缓存在本地(用户主目录
.m2
目录),后续直接使用缓存,无需重复下载。
-
镜像仓库(Mirror Repository)
-
作用:加速下载(如国内用户使用阿里云镜像)。
-
配置方法:在
.m2/settings.xml
中添加镜像配置:<settings> <mirrors> <mirror> <id>aliyun</id> <name>aliyun</name> <mirrorOf>central</mirrorOf> <url>https://maven.aliyun.com/repository/central</url> </mirror> </mirrors> </settings>
-
3、依赖唯一标识:groupId:artifactId:version
-
三要素:
groupId
:组织名称(如org.springframework.boot
)。artifactId
:组件名称(如spring-boot-starter-web
)。version
:版本号(如1.4.2.RELEASE
)。
-
注意:
- 以
-SNAPSHOT
结尾的版本为开发版,每次都会重新下载,仅用于私有仓库。 - 公开发布版本不可包含
SNAPSHOT
。
- 以
4、第三方组件搜索
- 官网:search.maven.org
- 操作:搜索关键字(如
okhttp
),获取groupId:artifactId:version
后直接复制使用。
5、Maven 使用方式
-
命令行编译
-
进入
pom.xml
所在目录,执行:mvn clean package # 清理并打包,结果存于target目录
-
-
IDE 集成(以 Eclipse 为例)
- 直接创建 / 导入 Maven 项目。
- 若项目报错,右键选择 Maven - Update Project 更新依赖。
三、Maven 构建流程核心内容
-
关键概念
-
生命周期(Lifecycle)
Maven 预定义的标准化流程,由一系列阶段(Phase)组成。- default 生命周期:处理项目部署,常见阶段包括
validate
(验证)、compile
(编译)、test
(测试)、package
(打包)、install
(安装到本地仓库)、deploy
(部署到远程仓库)。 - clean 生命周期:清理构建产物,包含
pre - clean
(预处理清理)、clean
(清理)、post - clean
(后续清理)阶段。
- default 生命周期:处理项目部署,常见阶段包括
-
阶段(Phase)
生命周期中的具体步骤,执行某个 Phase 会按顺序触发其前所有 Phase。例如:mvn package
:执行 default 生命周期,从validate
到package
的所有阶段。mvn clean package
:先执行 clean 生命周期的clean
阶段,再执行 default 的package
阶段。
-
目标(Goal)
具体的任务单元,与 Phase 绑定,命名格式为插件:任务
(如compiler:compile
)。执行 Phase 时会触发默认绑定的 Goal,少数场景需直接指定 Goal(如mvn tomcat:run
启动 Tomcat)。
-
-
常用命令示例
命令 说明 mvn clean
执行 clean 生命周期的 clean
阶段,清理构建产物mvn clean compile
先清理,再执行到 compile
阶段(编译源代码)mvn clean test
先清理,再执行到 test
阶段(运行测试,自动触发编译)mvn clean package
先清理,再执行到 package
阶段(打包为 JAR/WAR) -
类比说明
Lifecycle
→ Java 的package
(包含一组相关 Phase)。Phase
→ Java 的class
(包含具体任务 Goal)。Goal
→ Java 的method
(实际执行的操作)。
四、Maven 插件核心内容
1. Maven 插件基础概念
-
核心逻辑:Maven 通过 “生命周期(lifecycle)” 和 “阶段(phase)” 管理构建流程,每个 phase 依赖插件的 “目标(goal)” 实现具体功能。
- 例:执行
mvn compile
时,Maven 调用compiler
插件的compiler:compile
goal 完成编译。
- 例:执行
-
插件分类
-
内置标准插件:无需声明即可使用,预定义了 phase 与 goal 的映射关系。
插件名称 对应 phase 功能描述 clean
clean
清理构建输出 compiler
compile
编译 Java 源码 surefire
test
运行单元测试 jar
package
打包为 JAR 文件 -
自定义插件:需在
pom.xml
中声明依赖,配置插件的 groupId、artifactId、version 及执行阶段(phase)和目标(goal)。
-
2. 自定义插件配置示例
以maven-shade-plugin
(用于生成可执行 JAR)为例:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase> <!-- 绑定到package阶段 -->
<goals>
<goal>shade</goal> <!-- 执行shade目标 -->
</goals>
<configuration>
<!-- 配置插件参数:指定主类 -->
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.itranswarp.learnjava.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3. 常用自定义插件列表
插件名称 | 功能描述 |
---|---|
maven-shade-plugin | 打包所有依赖并生成可执行 JAR |
cobertura-maven-plugin | 生成单元测试覆盖率报告 |
findbugs-maven-plugin | 静态分析代码,查找潜在问题 |
4. 关键要点总结
- 插件是 Maven 实现构建功能的核心,通过 phase 触发执行。
- 内置插件无需声明,自定义插件必须在
pom.xml
中声明依赖和配置。 - 插件配置需参考官方文档,重点关注 phase 绑定、goal 定义及参数设置(如主类、输出路径等)。
五、模块管理
-
模块拆分目的:将大项目拆分为多个模块(如 Module A、B、C),降低软件复杂度,每个模块为独立 Maven 项目,有各自的
pom.xml
。 -
父模块(parent)作用
- 提取公共配置:定义子模块的公共配置,如
groupId
、version
、依赖(slf4j-api
、logback-classic
、junit
等)、编码格式、Java 版本等。 - 特殊配置:
packaging
为pom
,不含 Java 代码,仅用于配置继承。
- 提取公共配置:定义子模块的公共配置,如
-
子模块继承方式
- 简化配置:子模块(如模块 A、B、C)通过
<parent>
标签声明父模块,仅需定义自身唯一的artifactId
,其余配置自动继承父模块。 - 覆盖配置:若有特殊需求,可在子模块
pom.xml
中显式覆盖父模块配置(如修改依赖版本)。
- 简化配置:子模块(如模块 A、B、C)通过
-
模块依赖管理:若模块 A 依赖模块 B,需在模块 A 的
pom.xml
中通过<dependencies>
引入模块 B 的坐标(groupId
、artifactId
、version
)。 -
根模块(build)作用
- 统一编译:在根目录创建
pom.xml
,通过<modules>
标签列出所有子模块(包括 parent),执行mvn clean package
时按依赖顺序一次性编译所有模块。 - 配置示例:根模块
pom.xml
包含groupId
、artifactId
、version
,packaging
为pom
,并声明<modules>
列表。
- 统一编译:在根目录创建
-
Maven 仓库类型
- 中央仓库:第三方模块开发者发布 jar 包的公共仓库,如
commons logging
、log4j
等依赖可直接引用。 - 私有仓库:公司内部搭建的仓库,用于存储不公开的源码和 jar 包,通过本地
~/.m2/settings.xml
配置,使用方式与中央仓库一致。 - 本地仓库:本地开发项目的 “发布” 仓库,但不推荐将自研模块安装至此,因修改后需重新安装,易导致版本不一致,建议使用模块化编译管理依赖。
- 中央仓库:第三方模块开发者发布 jar 包的公共仓库,如