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

相关推荐
凭君语未可15 分钟前
Spring 框架中的常见注解讲解
java·spring
快乐吃手手 : )1 小时前
Java泛型(补档)
java·开发语言
优雅的落幕1 小时前
【SpringBoot】基于mybatisPlus的博客管理系统(2)
java·spring boot·后端
岁月0_0静好1 小时前
IDEA新版本Local Changes
java·ide·intellij-idea
caihuayuan41 小时前
在原生代码(非webpack)里使用iview的注意事项
java·大数据·sql·spring·课程设计
caihuayuan41 小时前
Vue ui初始化项目并使用iview写一个菜单导航
java·大数据·sql·spring·课程设计
boring_1112 小时前
Go与Cpp的本质区别
java·开发语言·golang
pofenx4 小时前
记录idea可以运行但是maven install打包却找不到问题
java·maven·intellij-idea
素雪风华4 小时前
服务容错治理框架resilience4j&sentinel基础应用---微服务的限流/熔断/降级解决方案
java·微服务·sentinel·springboot·服务容错·resilience