Maven 依赖传递和冲突、继承和聚合

news/2024/2/25 20:36:53/文章来源:https://blog.csdn.net/xhf852963/article/details/135616040

一、依赖传递和冲突

1.1 Maven 依赖传递特性

1.1.1 概念

        假如有三个 Maven 项目 ABC,其中项目依赖 B,项目 依赖 C。那么我们可以说 A 依赖 C。也就是说,依赖的关系为:A—>B—>C, 那么我们执行项目 A 时,会自动把 BC 都下载导入到 A 项目的 jar 包文件夹中,这就是依赖的传递性。

1.1.2 作用

        1、简化依赖导入过程

        2、确保依赖版本正确

1.1.3 传递的原则

        在 A 依赖 BB 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围以及配置。

        1、B 依赖 C 时使用 compile 范围:可以传递

        2、B 依赖 C 时使用 test provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。

        3、B 依赖 C 时,若配置了以下标签,则不能传递

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version><!-- 是否中断依赖--><optional>true</optional>
</dependency>

1.1.4 依赖传递中止的情况

        1、compile 范围进行依赖传递

        2、使用 optional 配置终止传递

        3、依赖冲突(传递的依赖已经存在)

1.1.5 案例

        比如说,我们在使用 jackson 时,需要导入下面的三个依赖。

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.14.2</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.14.2</version>
</dependency>

        但是根据依赖的传递关系,在 databind 里面是依赖其他两个依赖的,也就是说只需要导入一个 databind 即可,如下图:

1.2 Maven 依赖冲突特性

1.2.1 依赖冲突简介

        当直接引用或者间接引用出现了相同的 jar 包,此时项目就会出现相同的重复 jar 包,这就算作冲突。如下图:

        maven 拥有自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式。

1.2.2 自动选择

1.2.2.1 短路优先(第一原则)

        下面的两条路径第二条路径短(依赖的层级小),所以最终 A 会依赖 X(version 0.0.2)

        1、A —> B —> C —> D —> E —> X(version 0.0.1)

        2、A —> F —> X(version 0.0.2)

1.2.2.2 先声明优先(第二原则)

        依赖路径长度相同情况下,则谁先声明谁优先,即在项目 A pom 中,如果先声明的是 E ,那么就依赖 X(version 0.0.1),如果先声明的是 F ,那么就依赖 X(version 0.0.2)版本。

        1、A—>E—>X(version 0.0.1)

        2、A—>F—>X(version 0.0.2)

1.2.3 手动排除

        可以在 dependency 标签里面添加 exclusion 标签来排除依赖,如下所示:

<dependency><groupId>com.maven</groupId><artifactId>pro01-maven-java</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope><!-- 使用 excludes 标签配置依赖的排除  --><exclusions><!-- 在 exclude 标签中配置一个具体的排除 --><exclusion><!-- 指定要排除的依赖的坐标(不需要写version) --><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency>

二、继承和聚合

2.1  Maven 工程继承关系

2.1.1 继承概念

        Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。

2.1.2 继承作用

        在父工程中统一管理项目中的依赖信息。

2.1.3 背景

        1、对一个比较大型的项目进行了模块拆分。

        2、一个 project 下面,创建了很多个 module

        3、每一个 module 都需要配置自己的依赖信息。

2.1.4 需求

        1、在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。

        2、使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。

        3、使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

        4、通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。

2.1.5 继承语法

        父工程里面的 pom.xml 内容如下:

<groupId>com.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
<packaging>pom</packaging>

        子工程里面的 pom.xml 内容如下:

<!-- 使用parent标签指定当前工程的父工程 -->
<parent><!-- 父工程的坐标 --><groupId>com.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version>
</parent><!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->
<artifactId>maven-module</artifactId>

2.1.6 案例

        首先创建一个 maven-parent 模块作为父工程,如下:

          这个 src 目录没有什么用,因为这个 module 只是作为父工程,不会在里面编写代码,所以可以给他删除掉,最终的效果如下图:

        maven-parent 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>com.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>

        在  maven-parent 模块下右键,创建一个子工程 maven-son,如下图:

        项目的整体架构如下图所示: 

        maven-sonpom.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><!-- 使用 parent 标签指定当前工程的父工程 --><parent><groupId>com.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>maven-son</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>

        此时,一个 maven 的父子工程就创建成功了。

2.1.7 dependencies 标签

        如果想要子工程完全继承父工程的 maven 依赖,那么只需要在父工程里面使用 dependencies 标签添加依赖即可,如下图,且继承依赖的关系不受 <scope> 标签里面的属性影响。

        子工程不用在 pom.xml 里面配置任何的依赖即可享受父工程的所有依赖。

2.1.8 dependencyManagement 标签

        一般父工程的依赖都比较多,如果子工程不需要依赖全部,只需要依赖其中的几个,那么就需要使用 dependencyManagement 标签了。

        首先在 maven-parent 项目里面使用 dependencyManagement 标签来管理依赖,如下:

<?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>com.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>maven-son</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version><scope>provided</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.2</version><scope>test</scope></dependency></dependencies></dependencyManagement>
</project>

        一旦父工程使用 dependencyManagement 标签,那么 maven-son 项目的依赖就变成 0 了,如下图 

        此时,就需要在 maven-son 项目里面指定自己想要的依赖,如下图,版本号不用写,只需要写前面两个坐标即可,配置 maven-son 的依赖,如下图:

<?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><parent><groupId>com.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>maven-son</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency></dependencies>
</project>

        可以看到,出现了自己想要的依赖,如下图 

2.2 Maven 工程聚合关系

2.2.1 聚合概念

        Maven 聚合是指将多个项目组织到一个父级项目中,以便一起构建和管理的机制。聚合可以帮助我们更好地管理一组相关的子项目,同时简化它们的构建和部署过程。

2.2.2 聚合作用

        1、管理多个子项目,通过聚合,可以将多个子项目组织在一起,方便管理和维护。

        2、构建和发布一组相关的项目,通过聚合,可以在一个命令中构建和发布多个相关的项目,简化了部署和维护工作。

        3、优化构建顺序,通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。

        4、统一管理依赖项,通过聚合,可以在父项目中管理公共依赖项和插件,避免重复定义。

2.2.3 聚合语法

        在父项目中包含的子项目列表。如下,主要是 modules 标签。

<?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>com.maven</groupId><artifactId>maven-parent</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><!-- 这个是工程路径,不是工程名称--><module>maven-son</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>

2.2.4 聚合演示

        我们构建一个 maven-parent 项目,看看他是否可以自动构建他的子项目 maven-son,如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_926157.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig&#xff1b;.&#xff1b;..&#xff1b;./boot) 指定脚本执行路…

ES高级查询

ES中提供了一种强大的检索数据方式&#xff0c;这种检索方式称为Query DSL&#xff0c;这种方式的丰富查询语法让ES检索变得更强大&#xff0c;更简洁。 1.常见查询 1.1查询所有[match_all] match_all关键字&#xff1a;返回索引中的全部文档。 GET /products/_search { &…

Redis-redis.conf配置文件中的RDB与AOF持久化方式的详解与区别

RDB&#xff08;Redis Database&#xff09; RDB是Redis的默认持久化方式&#xff0c;它将内存中的数据以二进制格式写入磁盘&#xff0c;形成一个快照。RDB持久化有以下几个重要的配置选项&#xff1a; save&#xff1a;指定了保存RDB的策略&#xff0c;默认的配置是每900秒&…

域名群站开源系统分享开源域名授权系统

一、需要自己安装PHP和MYSQL服务器环境。 二、务必设置伪静态规则&#xff0c;否则将无法访问文章栏目页面。 三、启用伪静态功能&#xff0c;请在站点设置中选择使用thinkphp的伪静态规则。 四、在域名的根目录下找到”data/config.php”文件&#xff0c;填入数据库的账号和…

使用WAF防御网络上的隐蔽威胁之CSRF攻击

在网络安全领域&#xff0c;除了常见的XSS&#xff08;跨站脚本&#xff09;攻击外&#xff0c;CSRF&#xff08;跨站请求伪造&#xff09;攻击也是一种常见且危险的威胁。这种攻击利用用户已经验证的身份在没有用户知情的情况下&#xff0c;执行非授权的操作。了解CSRF攻击的机…

无需主网结算来进行 BTC 交易?Tectum 提出了新的解决方案

撰文&#xff1a;Tom&#xff0c;CryptoBooster 下载TechubNews APP&#xff0c;探索Web3的无限可能&#xff01;掌握最新动态&#xff0c;发现更多相关资讯&#xff0c;与行业领袖共同探索未来趋势。立即下载&#xff0c;开启您的Web3之旅&#xff01; 区块链发展至今&#x…

解决防爬虫机制方法(二)

最近为了完成学校的大数据的作业&#xff0c;老师要我们爬一个的网站&#xff0c;里面有还算不错的防爬机制&#xff0c;忙活了几天&#xff0c;总结出一些常见的防爬机制的应对方法&#xff0c;方法均来自个人实战总结&#xff0c;非专业爬虫角度分析 承接上一次讲的方法解决…

MybatisPlus-删除

目录 1.数据库建表 2.项目 ---就是更新del_flag字段为2 (1)pom.xml (2)Application (3)applicatiom.yml (4)entity (5)mapper (6)service (7)service目录下的impl目录 (8)common (9)enums (10)config (11)controller postman测试 3.彻底删除数据库记录 (11&…

Shell脚本同时调用#!/bin/bash和#!/usr/bin/expect

如果你想在一个脚本中同时使用bash和expect&#xff0c;你可以将expect部分嵌入到bash脚本中。以下是一个示例&#xff1a; #!/bin/bash# 设置MySQL服务器地址、端口、用户名和密码 MYSQL_HOST"localhost" MYSQL_PORT"3306" MYSQL_USER"your_usernam…

windows 环境下使用脚本备份 oracle 数据库数据

文章目录 前言一、修改点1.设置用户名、密码和要备份的数据库2.创建备份目录3.详情&#xff1a;Bak.bat 文件 二、定时任务自启动bat文件总结 前言 当我们的系统部署在 windows 上时&#xff0c;且使用的数据库为 oracle 时&#xff0c;需要将数据库的数据定时备份。 提示&…

解决Spring Boot跨域问题(配置JAVA类)

什么是跨域问题 跨域问题指的是不同端口之间&#xff0c;使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制&#xff0c;它是为了保证用户的安全&#xff0c;防止恶意网站窃取数据。 比如前端用的端口号为8081&#xff0c;后端用的端口号为8080&#xff0c;后…

在pycharm远程连接树莓派遇到的No files or folders found to process处理办法

在PyCharm中解决"No files or folders found to process"错误的另一个方法是通过Deployment中的Configuration选项。在PyCharm中&#xff0c;找到Tool并选择Deployment&#xff0c;然后点击Configuration。 在设置路径的过程中需要注意目标目录是相对的 在中 会识…

AI大模型预先学习笔记三:使用Assistants API快速搭建领域专属AI助手

文章目录 一、什么是AssistantsAPI二、为什么用AssistantsAPI三、Demo展示及能力介绍四、Demo框架及具体实现五、从Demo到实际应用的Gap 一、什么是AssistantsAPI 介绍 OpenAI的第一手发布者API文档&#xff0c;也就是相当于GPT的API 二、为什么用AssistantsAPI 优点 够全、…

华为数通方向HCIP-DataCom H12-831题库(判断题:1-20)

第01题 为了加快IS-IS网络中链路故障的感知速度,可以将IS-IS与BFD联动 正确 错误 答案:正确 解析: OSPF和IS-IS都可以设置与BFD联动加速链路故障检测 ,使用BFD时,可以实现毫秒级别的链路切换,所以使用IS–IS与BFD联动,可以加快IS–IS的感知速度 第02题 在OSPF中ABR会将…

MySQL表的内连和外连

文章目录 前言一、表的内连接和外连接内连接外连接左外连接右外连接 使用场景 前言 一、表的内连接和外连接 表的连接分为内连接和外连接。 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在…

推荐几个Github高星GoLang管理系统

在Web开发领域&#xff0c;Go语言&#xff08;Golang&#xff09;以其高效、简洁、高并发等特性逐渐成为许多开发者的首选语言。有许多优秀的Go语言Web后台管理系统&#xff0c;这些项目星星众多&#xff0c;提供了丰富的功能和良好的代码质量。本文将介绍一些GitHub高星的GoLa…

工具推荐 |Devv.ai — 最懂程序员的新一代 AI 搜索引擎

介绍 伴随 GPT 的出现&#xff0c;我们可以看到越来越多的 AI 产品&#xff0c;其中也不乏针对程序员做的代码生成工具。 今天介绍的这款产品是一款针对中文开发者的 AI 搜索引擎&#xff0c;Devv.ai 使用 Devv.ai 的使用非常简单&#xff0c;就是传统的搜索场景&#xff…

传感数据分析——傅里叶滤波与小波滤波

传感数据分析——傅里叶滤波与小波滤波 文章目录 传感数据分析——傅里叶滤波与小波滤波前言一、运行环境二、Python实现总结 前言 傅里叶滤波的原理&#xff1a; 傅里叶滤波是基于傅里叶变换的一种信号处理方法&#xff0c;它的原理如下&#xff1a; 傅里叶变换&#xff1a; …

图像处理------亮度

from PIL import Imagedef change_brightness(img: Image, level: float) -> Image:"""按照给定的亮度等级&#xff0c;改变图片的亮度"""def brightness(c: int) -> float:return 128 level (c - 128)if not -255.0 < level < 25…

mysql从入门到放弃之数据库体系结构与管理

文章目录 前言一、体系结构1、mysql c/s结构介绍2、mysql实例组成3、mysqld程序运行原理3.1、mysqld守护进程结构3.2、 引入sql语句结构化的查询语言3.3、探索一条SQL语句的执行过程 二、mysql逻辑存储结构三、mysql物理存储结构3.1、innodb存储引擎的段、区、页之间的关系 四、…