Maven学习归纳(四)——传递依赖和依赖的规则
一、传递依赖
官方文档解释的传送门:http://ifeve.com/maven-dependency-mechanism/
当存在传递依赖的情况时,主工程对间接依赖的jar可以访问吗?
例如:A.jar依赖于B.jar,而B.jar依赖于C.jar,那么要怎么修改配置文件,才会让A.jar 也依赖 B.jar 呢?
这要看传递依赖的jar包引入时的依赖范围——只有依赖范围为compile时可以访问
即 要使A.jar 依赖于C.jar 当且仅当C.jar的范围是compile

如下演示HelloWrold2项目依赖 ——》HelloWrold项目依赖——》junit
此时HelloWrold这个项目是有junit.jar包的,而HelloWrold2是没有junit这个jar包的,如下所示:

需要在被依赖的项目HelloWorld的pom.xml上改写

改写之后,项目就出现了需要间接依赖的的jar包

二、依赖原则
依赖原则目的:防止jar包的冲突
为了避免造成依赖重复,需要选择一个依赖路径
1. 路径最短优先原则
存在两个项目依赖同个类型但不同版本的jar包,这个时候会优先选择路径短的
项目配置情况:
HelloWrold2 依赖 HelloWrold
HelloWrold 依赖 Junit3.8 jar
HelloWrold 依赖 Junit4.0 jar
从图中看,显然junit3.8距离HelloWrold2更近点的
既然都拥有junit这个包,那么原本是 3.8 的 HelloWrold2 再依赖了HelloWrold后,会发生什么情况呢??

配置如下:

运行结果如图所示:此时HelloWrold保持原来的junit-3.8.jar不变

2. 路径长度相同
路径长度相同的情况下,又可以分为是否有在同一个pom.xml两种情况
2.1 覆盖:
如果在同一pom.xml文件中有2个相同的依赖;后面声明的会覆盖前面的依赖
但这里要说严禁使用本情况,严禁在同一个pom中声明两个不同的依赖

2.2 优先:
如果是在不同pom.xml中有2个相同的依赖;则先声明的依赖,会覆盖后面生命的依赖
如下HelloWorld2依赖项目HelloWorld,和项目HelloWorld3
HelloWorld与HelloWorld3都有不同版本的commons-fileupload.jar
显然,先写在前面的HelloWorld3的jar包被采用了

简单的依赖就完了呢~ o(* ̄▽ ̄*)o
Maven学习归纳(四)——传递依赖和依赖的规则的更多相关文章
- Maven学习笔记(四):协调和依赖
Maven协调具体的解释: Maven定义了这样一组规则:世界上不论什么一个构件都能够使用Maven坐标唯一标识.Maven坐标的元素包含groupId.artifactId.version ...
- (转)Maven学习总结(四)——Maven核心概念
孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(四)——Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Mav ...
- Maven学习(二) -- 坐标和依赖
标签(空格分隔): 学习笔记 坐标 实际就像在几何中,我们用一对坐标(x, y)来表示坐标系中唯一的点:或者我们可以用(经度,纬度)来表示地球上的某一个位置,在Maven的世界中,有坐标来唯一的表示项 ...
- Maven学习笔记2(坐标和依赖)
1.坐标 Maven坐标为各个构件建立了秩序,任何一个构件都必须明确自己的坐标,一个maven坐标是由一些元素确定的 <groupId>com.alivn.account</grou ...
- Maven学习(四)Maven 命令行选项
说明: 1.使用-选项时,和后面的参数之间可以不要空格.而使用--选项时,和后面的参数之 间必须有空格.如下面的例子: $ mvn help:describe -Dcmd=compiler:co ...
- Maven学习归纳(一)——简单的环境配置入门
一.Maven的基本概念 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的编译,测试,构建,报告和文档的软件项目管理工具和解决依赖关系的工具. 1.1 项目的构建 项目的构建 ...
- Maven学习小结(四 聚合与继承)
1.聚合 一次构建多个项目模块. 2.继承 为了消除重复,把很多相同的配置提取出来,例如groupid和version: 2.1 Maven中可以继承的POM元素 groupId :项目组 ID ,项 ...
- Maven学习归纳(三)——依赖添加依赖排除与项目整合
一.Maven的坐标 1. 坐标的定义 数学意义上的坐标可以是平面上的(x,y)也可以是空间上的(x,y,z),都可以确定一个质点的位置和方向. Maven中有很多构件,为了能够自动化解析任何一个构件 ...
- Maven 学习总结(三) 之 依赖管理
聚合 为了要一次构建多个项目,而不是到每个模块目录下分别执行mvn命令.maven聚合这一特性就是为该需求服务的.为此我们需要创建一个额外的模块aggregator, 然后通过该模块构建整个项目的所有 ...
随机推荐
- Hadoop单机、伪分布式、分布式集群搭建
JDK安装 设置hostname [root@bigdata111 ~]# vi /etc/hostname 设置机器hosts [root@bigdata111 ~]# vi /etc/hosts ...
- Linux系统关机与重新引导流程简介
引言 在<Linux启动之旅>中,我们了解了Linux的启动过程,下面我们一同来学习Linux关机与重新引导流程. 不同于桌面系统,作为服务器,我们较少对Linux系统进行系统重启,但在以 ...
- 通过Blazor使用C#开发SPA单页面应用程序(1)
2019年9月23——25日 .NET Core 3.0即将在.NET Conf上发布! .NET Core的发布及成熟重燃了.net程序员的热情和希望,一些.net大咖也在积极的为推动.NET Co ...
- AutoCAD二次开发(.Net)之获取LSP变量的值
//https://blog.csdn.net/qq_21489689/article/details/78973787 [System.Security.SuppressUnmanagedCodeS ...
- Go-如何读取yaml,json,ini等配置文件
1. json使用 JSON 应该比较熟悉,它是一种轻量级的数据交换格式.层次结构简洁清晰 ,易于阅读和编写,同时也易于机器解析和生成. 创建 conf.json: { "enabled&q ...
- csdn论坛页抓取
抓取csdn论坛 实现功能 获取论坛分类所有链接,并拼接成推荐精华页的完成的链接 获取推荐精华页的帖子状态,赏分,帖子标题,作者,发布时间,回复量,查看量,最后发表时间 置顶内容不爬取,只打印置顶内容 ...
- Mina实现Socket通信完整过程
目录 服务端 客户端 通信 自定义工厂编解码 解码器 编码器 总结 # 加入战队 微信公众号 title: Mina服务端客户端通信 date: 2018-09-30 09:00:30 tags: - ...
- Java基础及JavaWEB以及SSM框架学习笔记Xmind版
Java基础及JavaWEB以及SSM框架学习笔记Xmind版 转行做程序员也1年多了,最近开始整理以前学习过程中记录的笔记,以及一些容易犯错的内容.现在分享给网友们.笔记共三部分. JavaSE 目 ...
- centos7搭建hadoop3.*.*系列
最近搭建这个hadoop踩过不少坑,先是配置JDK搞错路径(普通用户和root用户下的路径不同),再就是hadoop版本不同导致的启动错误,网上找到的是hadoop2.*.*的版本,但是我安装的had ...
- 本地图片上传到GitHub,MarkDown使用Github图片地址
最近在学习用markdown编辑器,我是直接用有道云笔记编辑的,感觉真的好好用,编辑了一半的博客,可以按样式保存在云笔记中,我再也不会忘记写博客了~~ 但是在编辑博客的时候发现了一个问题,那就是本地图 ...