Maven进阶

目录

引言

一、POM文件

关键元素

二、坐标与依赖管理

[1. 坐标(Coordinates)](#1. 坐标(Coordinates))

[2. 依赖范围(Scope)](#2. 依赖范围(Scope))

[3. 依赖传递与冲突解决](#3. 依赖传递与冲突解决)

三、Maven仓库体系

[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)

通过groupIdartifactIdversion唯一标识一个构件,例如:

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 :核心构建流程(compiletestpackageinstall)。

  • 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支持)提升开发效率。

相关推荐
兩尛2 分钟前
Spring面试
java·spring·面试
Java中文社群9 分钟前
服务器被攻击!原因竟然是他?真没想到...
java·后端
Full Stack Developme20 分钟前
java.nio 包详解
java·python·nio
零千叶36 分钟前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
代码充电宝1 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
li3714908901 小时前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
摇滚侠1 小时前
Spring Boot 项目, idea 控制台日志设置彩色
java·spring boot·intellij-idea
Aevget2 小时前
「Java EE开发指南」用MyEclipse开发的EJB开发工具(二)
java·ide·java-ee·eclipse·myeclipse
黄昏晓x2 小时前
C++----多态
java·jvm·c++
Brookty2 小时前
【算法】前缀和
java·学习·算法·前缀和·动态规划