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

一、依赖传递和冲突

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.mfbz.cn/a/329709.html

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

相关文章

性能优化-一文宏观理解OpenCL

本文主要对OpenCL做一个整体的介绍、包括环境搭建、第一个OpenCL程序、架构、优化策略&#xff0c;希望对读者有所收获。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…

利用 ChatGPT 高效搜索:举一反三的思考方式,高效查找解决方案

文章目录 基础思路举一反三Go 语言 Web 框架延伸思考思考结论 本文只是我的一些尝试&#xff0c;基于 ChatGPT 实现系统化快速搜索某编程语言的特定领域相关包或者基于其他语言类推荐落地方案的尝试。 这篇文章中描述的方式不一定是好方式&#xff0c;但应该会有一定的启示作用…

Autosar --- CRC8 SAE J1850 CRC计算

前言 CRC计算一般用于通信中&#xff0c;用来保证一组数据的完整性。 发送方发送一组数据dataACRC检验码CRCa&#xff08;CRC校验码由数据算出&#xff09;&#xff1b; 接收方接收到数据dataACRC校验码CRCa&#xff0c;接收方通过与发送方约定好的计算公式&#xff0c;计算出一…

*p++和(*p)++一样吗

大家好&#xff0c;今天给大家介绍*p和&#xff08;*p)的区别&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 *p 和 (*p) 在 C/C 语言中具有不同的含义。 *p&#xff1a;这个表…

Java研学-Maven基础

一 概述 Maven是一个跨平台的项目管理工具&#xff0c;主要用于基于 Java 平台的项目&#xff08;Maven 底层为Java&#xff09;构建、依赖包管理和项目信息管理&#xff0c;只需要运行一条简单的命令&#xff0c;就能高效的完成构建动作   Maven 能提供一种项目的依赖配置&a…

精细微调技术在大型预训练模型优化中的应用

目录 前言1 Delta微调简介2 参数微调的有效性2.1 通用知识的激发2.2 高效的优化手段3 Delta微调的类别3.1 增量式微调3.2 指定式微调3.3 重参数化方法 4 统一不同微调方法4.1 整合多种微调方法4.2 动态调整微调策略4.3 超参数搜索和优化 结语 前言 随着大型预训练模型在自然语…

超优秀的三维模型优化平台(轻量化、格式转换、可视化等)

老子云概述 老子云3D可视化快速开发平台&#xff0c;集云压缩、云烘焙、云存储云展示于一体&#xff0c;使3D模型资源自动输出至移动端PC端、Web端&#xff0c;能在多设备、全平台进行展示和交互&#xff0c;是全球领先、自主可控的自动化3D云引擎。 平台架构 平台特性 基于 …

C#,人工智能,机器人,路径规划,A*(AStar Algorithm)算法、源代码及计算数据可视化

Peter Hart Nils Nilsson Bertram Raphael 参考&#xff1a; C#&#xff0c;人工智能&#xff08;AI&#xff09;机器人路径规划&#xff08;Path Planning&#xff09;的ARA*&#xff08;Anytime Replanning A* Algorithm&#xff09;算法与源程序https://blog.csdn.net/…

Apache Doris (六十四): Flink Doris Connector - (1)-源码编译

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Flink与Doris版本兼容

【大数据】Flink 详解(八):SQL 篇 Ⅰ

《Flink 详解》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 10 10 10 篇文章&#xff1a; 【大数据】Flink 详解&#xff08;一&#xff09;&#xff1a;基础篇【大数据】Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅰ【大数据】Flink 详解&…

基于Java+SSM+MYSQL的助农特色农产品销售系统详细设计和实现【附源码】

基于JavaSSM助农特色农产品销售系统详细设计和实现【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定…

笔试面试题——继承和多态

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、什么是多态&#xff1f;二、什么是重载、重写(覆盖)、重定义(隐藏)&#xff1f;三、 inli…

使用 Python 创造你自己的计算机游戏(游戏编程快速上手)第四版:第十九章到第二十一章

十九、碰撞检测 原文&#xff1a;inventwithpython.com/invent4thed/chapter19.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 碰撞检测涉及确定屏幕上的两个物体何时相互接触&#xff08;即发生碰撞&#xff09;。碰撞检测对于游戏非常有用。例如&#xff0c;如…

《动手学深度学习》学习笔记 第9章 现代循环神经网络

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知识&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…

成功 BOM 流程的五个基本要素

您应该以确保 BOM 流程的方式实现和启用它们&#xff1a; 准确的 当前的 完全的 清除 可行的 追求准确性 为下游提供准确数据 制造商使用其 BOM 来通知下游操作他们需要执行什么。不言而喻&#xff0c;向其他团队和员工提供准确的信息至关重要&#xff1b;否则&…

transbigdata笔记:栅格参数优化

在transbigdata中&#xff0c;栅格参数有如下几个 params(lonStart,latStart,deltaLon,deltaLat,theta) 如何选择合适的栅格参数是很重要的事情&#xff0c;这会对最终的分析结果产生很大的影响。 怎么选择参数&#xff0c;和数据以及分析的目的息息相关&#xff0c;transbi…

25考研英语复习计划

Hello各位小伙伴大家好&#xff0c;今天要给大家分享的是英语备考计划&#xff0c;大家可以作为参考&#xff0c;制定适合自己的备考计划。 【英一/二】 英语分为英一、英二&#xff0c;一般学硕英一&#xff0c;专硕英二。 英一要比英二难度大。 【复习计划】 1-2月&#xf…

383. 观光(dp思想运用,Dijkstra)

383. 观光 - AcWing题库 “您的个人假期”旅行社组织了一次比荷卢经济联盟的巴士之旅。 比荷卢经济联盟有很多公交线路。 每天公共汽车都会从一座城市开往另一座城市。 沿途汽车可能会在一些城市&#xff08;零或更多&#xff09;停靠。 旅行社计划旅途从 S 城市出发&…

1.C语言基础知识

这里写目录标题 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

信管网2023年上半年信息系统项目管理师论文真题

链接 信息系统项目管理师真题题库 - 信管网 上午综合知识、下午案例分析和下午论文三部分 可以单个试题查看 可以在线考试 在线考试又分&#xff1a;考试模式、练习模式和机考模式
最新文章