目录
[1. 坐标(Coordinates)](#1. 坐标(Coordinates))
[2. 依赖范围(Scope)](#2. 依赖范围(Scope))
[3. 依赖传递与冲突解决](#3. 依赖传递与冲突解决)
[1. 本地仓库](#1. 本地仓库)
[2. 中央仓库](#2. 中央仓库)
[3. 依赖搜索顺序](#3. 依赖搜索顺序)
[1. 三大生命周期](#1. 三大生命周期)
[2. 常用插件与绑定](#2. 常用插件与绑定)
[1. IDEA实现Maven的继承](#1. IDEA实现Maven的继承)
[1.1 创建父类项目](#1.1 创建父类项目)
[1.2 创建子类项目core](#1.2 创建子类项目core)
[1.3 创建manage和portal项目](#1.3 创建manage和portal项目)
[2. 继承:统一管理依赖版本](#2. 继承:统一管理依赖版本)
[3. 聚合:一键构建所有模块](#3. 聚合:一键构建所有模块)
引言
Maven作为Java项目管理的核心工具,其进阶功能能显著提升构建效率和代码可维护性。本文将深入解析POM文件 、依赖管理 、生命周期 及多模块协作,通过详实的代码示例和配置说明,助你掌握Maven的高阶应用。
一、POM文件
POM(Project Object Model)是Maven项目的核心配置文件(pom.xml),定义了项目的元数据、依赖关系和构建配置。
关键元素
-
groupId
:组织标识(一般为公司网址的反写+项目名)。 -
artifactId
:项目唯一标识(项目名称,一般为项目名-模块名)。 -
version
:版本号(遵循主版本.次版本.修订号
)。-
形式为0.0.1-SNAPSHOT:
-
第一个 0 表示大版本号,第二个 0 表示分支版本号(某个模块功能改变),第三个 0 表示小版本号(某个功能的部分修改)
-
++++SNAPSHOT -- 快照版本++++ ,ALPHA -- 内测版本,BETA -- 公测版本,++++RELEASE -- 稳定版本++++,GA -- 正式发布
-
-
packaging
:打包方式(jar、war、pom等)。
XML
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.tx.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.tx.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
二、坐标与依赖管理
1. 坐标(Coordinates)
通过groupId
、artifactId
、version
唯一标识一个构件,例如:
XML
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.10</version>
</dependency>
2. 依赖范围(Scope)
控制依赖在不同构建阶段的可见性:
Scope | 编译 | 测试 | 运行 | 示例 |
---|---|---|---|---|
compile |
✔️ | ✔️ | ✔️ | Spring Core |
test |
✖️ | ✔️ | ✖️ | JUnit |
provided |
✔️ | ✔️ | ✖️ | Servlet API |
runtime |
✖️ | ✔️ | ✔️ | JDBC驱动 |
XML
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope> <!-- 运行时由Web容器提供 -->
</dependency>
3. 依赖传递与冲突解决
-
依赖传递:A依赖B,B依赖C → A自动依赖C。
-
冲突解决:
-
最短路径优先:优先选择依赖树中路径短的版本。
-
声明优先:先声明的依赖版本生效。
-
示例:
第一直接依赖: HelloFriend项目依赖Hello项目
第二直接依赖: MakeFriend项目依赖HelloFriend项目
依赖阻断:
XML
<!-- HelloFriend pom.xml -->
<dependency>
<groupId>cn.tx.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
<!-- 依赖阻断:表示当HelloFriend被其他项目依赖时,不传递
Hello的依赖至依赖于HelloFriend -->
<optional>true</optional>
</dependency>
手动排除依赖(即可选依赖):
XML
<!-- MakeFriend pom.xml -->
<dependencies>
<dependency>
<groupId>cn.tx.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
<!-- 排除依赖的集合 -->
<exclusions>
<!-- 排除依赖的单体 -->
<exclusion>
<groupId>cn.tx.maven</groupId>
<artifactId>Hello</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
三、Maven仓库体系
1. 本地仓库
默认路径:~/.m2/repository
,可通过maven包下conf中的settings.xml
自定义:
XML
<settings>
<localRepository>/path/to/custom/repo</localRepository>
</settings>
2. 中央仓库
Maven默认的远程仓库,存储大量开源构件。无需额外配置,但依赖下载速度可能受限。
3. 依赖搜索顺序

四、生命周期与插件
1. 三大生命周期
-
Clean :清理构建产物(
mvn clean
)。 -
Default :核心构建流程(
compile
→test
→package
→install
)。 -
Site:生成项目文档站点。
2. 常用插件与绑定
生命周期阶段 | 插件目标 | 功能 |
---|---|---|
compile |
maven-compiler-plugin:compile |
编译主代码 |
test |
maven-surefire-plugin:test |
执行单元测试 |
package |
maven-jar-plugin:jar |
打包为JAR文件 |
install |
maven-install-plugin:install |
安装构件到本地仓库 |
五、多模块项目管理:继承与聚合
1. I DEA 实现Maven的继承
1.1 创建父类项目



1.2 创建子类项目core





1.3 创建manage和portal项目




至此,一个由parent统一管理core,manage和portal的mavan项目就创建好了;观察父子项目的pom文件配置。
2. 继承:统一管理依赖版本
父POM配置:
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.tx.extends</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>core</module>
<module>manange</module>
<module>portal</module>
</modules>
<properties>
<mysql.version>5.1.28</mysql.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
子模块配置:
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>parent</artifactId>
<groupId>cn.tx.extends</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>core</artifactId>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId><!-- 版本继承自父POM -->
</dependency>
</dependencies>
</project>
父类直接引用依赖,如果在父类的dependencies内直接引用依赖,则子类都会继承该依赖,以mybatis为例:

父类通过dependencyManagement管理依赖,子类不会默认继承该依赖,但是当子类使用该依赖时无需考虑版本信息,直接继承父类dependencyManagement中设置的版本号(Version),以log4j为例:


3. 聚合:一键构建所有模块
父POM配置:
XML
<modules>
<module>core</module>
<module>manange</module>
<module>portal</module>
</modules>
我们在平时的开发中,项目往往会被划分为好几个模块,比如common公共模块、system系统模块、log日志模块、reports统计模块、monitor监控模块等等。这时我们肯定会出现这么一个需要,我们需要一次构件多个模块,而不用每个模块都去mvn;
以上面得父子项目为例,当我们对parent进行mvn install时,会对core,manage和portal项目均进行install操作:


结语
通过掌握Maven的POM配置 、依赖管理 、生命周期 及多模块协作,开发者能够构建高效、可维护的Java项目。建议在实际项目中逐步应用这些进阶功能,并结合工具链(如IDEA的Maven支持)提升开发效率。