武林外传—阿沅,这是依赖传递呀!
武三通最近收养了一个义女,叫阿沅,此女自幼父母双亡,十分孤苦,武三通对他一直疼爱有加,不光教她武术,还教她编程,想着日后等阿沅长大了,也可以当个程序媛什么的,作为谋生的本领。
一日,阿沅正一个人鼓捣着pom文件,仿佛遇见了什么问题,总是鼓捣不出来,她叫到:“义父,这些jar包怎么也引不进来呀!”
武三通闻讯而至,道:“小阿沅,遇到什么难题了。”
阿沅指着屏幕道:“义父,你看!”
武三通背着手,凑近看,道:“嘿,你这个jar包是这样引入的呀。”
<dependency><groupId>cn.taoyuan</groupId><artifactId>sdk-client</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>${project.basedir}/lib/sdk-client-1.0-SNAPSHOT.jar</systemPath>
</dependency>
“是啊,我引入了这个包,这个包本身也依赖好多jar包,像commons-lang3,httpcore这些,可是我执行sdk方法时却说少了这些类,这些类不是在引入sdk jar包的时候自动引入吗,这个叫依赖传递。”
“对,小阿沅真聪明,可是你却没有学透呀,这个依赖传递有限制条件的。”
“什么限制条件呀。” 阿沅回过头,眼睛一眨一眨的,像是星星一般。
武三通在师兄朱子柳面前如同菜鸟一般,这回好不容易进来一个比他更菜的娃娃,还不趁机好好显摆一番,道:“阿沅别急,待义父给你从头细细道来。”
“我们有maven项目a,b,c,a依赖b,b依赖c,即a->b->c,当执行执行a时,会自动把b,c作为jar包导入,这是依赖的传递性。如果不想传递c,在引入b包时可以用 排除,这个你也看过。”
“那如果发生了依赖冲突怎么办,依赖传递的时候引入同名,版本不同的jar包。”
“这个也好办,当依赖路径长度不同时,遵循短路优先原则,如果长度相同,那谁先声明谁就优先。”
“奥.....”阿沅似乎有些懂了,但她最关心的还是刚才那个问题。
“好,我们切入正题,依赖传递有哪些限制呢?” 武三通讲得眉飞色舞,“这就涉及到依赖范围这个概念。来看这张图。”
compile | provided | runtime | test | |
---|---|---|---|---|
compile | compile(*) | – | runtime | – |
provided | provided | – | provided | – |
runtime | runtime | – | runtime | – |
test | test | – | test | – |
“这里,最左侧一列代表了直接依赖范围,最顶层一行代表了传递性依赖的范围,行与列的交叉单元格就表示最终的传递性依赖范围。表中的“-“表示该传递性依赖将会被忽略。”
“这些compile,provided什么意思呀?”
“maven文档里都有。我给你解说一下。” 武三通道。
“compile是默认范围,编译依赖对项目所有的classpath都可用,它会传递到依赖的项目。而provided范围表明你希望由JDK或者某个容器提供运行时依赖。例如,当使用Java EE构建一个web应用时,你会设置对Servlet API和相关的Java EE APIs的依赖范围为provided,因为web容器提供了运行时的依赖。它只对编译和测试classpath有效,并且不能传递。”
“我指定的是scope是system。”
“system范围与provided类似,只不过你必须显式指定一个本地系统路径的JAR。你看表,直接依赖范围是provided时,即使传递性依赖范围是compile,最终的依赖范围还是provided,正如我们刚才说的,依赖不能传递。system也是同样的道理。”
“那我该把scope改成compile吗?”
“对,你试试,不过你先把sdk jar放入本地仓库或者远程仓库吧。还记得那个经典的命令吗?”
“记得!” 阿沅笑道。改了pom文件,
<dependency><groupId>cn.taoyuan</groupId><artifactId>sdk-client</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
在屏幕上打出了:
mvn install:install-file -Dfile=/Users/ayuan/code/sdk/target/sdk-1.0-SNAPSHOT.jar -DgroupId=cn.taoyuan -DartifactId=sdk-client -Dversion=1.0-SNAPSHOT -Dpackaging=jar
所有依赖最终成功引入!
maven官网文档: http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
java达人
ID:drjava
(长按或扫码识别)
武林外传—阿沅,这是依赖传递呀!相关推荐
- maven 的依赖传递
1. 首先就maven的依赖传递来说:只有<scope>compile</scope>时,才能进行依赖的传递,其他的范围没有依赖传递可言!!! 2. 当依赖级别相同时, ...
- Maven中 jar包冲突原理与解决办法依赖传递
Maven中 jar包冲突原理与解决办法&依赖传递 管理包依赖是 Maven 核心功能之一,下面通过如何引入 jar 包:如何解析 jar 包依赖:包冲突是如何产生:如何解决包冲突:依赖管理解 ...
- maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile
maven是当前Java项目中用到最多的依赖管理工具.最开始的项目比较小引入的依赖包也少所以可以通过手动加载jar包的方式来管理依赖包:但随着项目越来越复杂各种大小框架层出不穷,一个项目的开发往往依赖 ...
- 【Android Gradle 插件】Android 依赖管理 ⑥ ( 依赖冲突处理 | transitive 依赖传递设置 | exclude 依赖排除设置 | force 强制指定依赖库 )
文章目录 一.查询 Android 依赖库的配置 二.通过 ModuleDependency#transitive 依赖传递设置 三.通过 ModuleDependency#exclude 设置排除子 ...
- 用exclusion切断maven jar包的依赖传递
1.问题描述 proxool 包依赖的avalon-framework-api包,如何切断这种依赖关系呢? 2.解决方法 在pom文件中,通过exclusion标签,切断maven jar包的依赖传 ...
- 02-Maven高级-分模块开发、依赖传递、聚合、继承(SpringBoot的部分底层原理)、多模块开发(环境切换)、Nexus私服搭建与使用
文章目录 学习目标 一.分模块开发与设计 1. 分模块开发的意义 问题导入 模块拆分原则 2. 分模块开发(模块拆分) 问题导入 2.1 创建Maven模块 2.2 书写模块代码 2.3 通过mave ...
- 【热门框架】Maven依赖传递,可选依赖以及排除依赖指的是什么?有什么意义?
Maven依赖传递是指当一个项目依赖另一个项目时,Maven会自动下载并构建这些依赖项,同时还会将这些依赖项所依赖的其他项一并下载并构建.这个过程会一直递归下去,直到所有依赖的项都被下载并构建完成.这 ...
- maven依赖管理(依赖配置、依赖传递、依赖冲突、依赖范围)
文章目录 基本说明 依赖配置 依赖传递 直接依赖 间接依赖 依赖冲突 路径优先 声明优先 特殊依赖 可选依赖 排除依赖 可选依赖和排除依赖区别 依赖范围 总结 基本说明 这篇文章会介绍在maven中的 ...
- Maven依赖配置、依赖传递和依赖范围。
一.依赖传递. 依赖具有传递性: 1.直接依赖:在当前项目中通过依赖配置建立的依赖关系. 2.间接依赖:被资源的资源如果依赖其他资源,当前项目简介依赖其他资源. 3.依赖传递冲突问题: 路径优先:当依 ...
最新文章
- matplotlib生成指定大小的空白的白色图(故意保存)实战:当然也可以保存正常的有内容的图像
- 美空管官员:政府停摆致人手不足 危及航空安全
- Selenium+TestNG+Jenkins 框架图形化UML表示
- 职业标准体系一般有几个层次划分_全国首个粤菜标准体系规划发布
- 分布式与人工智能课程(part14)--深度学习
- 独家 | 蚂蚁金服TRaaS技术风险防控平台解密
- 谈谈女友卸妆后的感受?
- java jndi使用_Java项目中使用JNDI连接数据库
- NLP《词汇表示方法(三)word2vec》
- c mysql用户登录_SQL语句及5.7.2 mysql 用户管理 c_G
- 京东发布全球物流无人机研报:美国领先、非洲政策最开放,中国产业链全景最复杂...
- java 合并对象中属性_Java2个对象形集合按某一个属性合并
- 计算机数字雨教程视频,股票配资火爆cmd什么意思(cmd命令数字雨)
- 怎么让自媒体文章原创度变高?原创度达到多少才算合格?
- C4D R23 安装教程
- PAT 1055 集体照 python
- 计算机无法安装hp网络打印机,hp打印机驱动安装失败怎么办 hp打印机驱动安装失败的解决办法...
- 32、T5L 迪文屏 C51开发之数据存储模型
- 自己的微信小程序学习笔记【1】——小程序开发工具的使用及项目文件说明
- iPhone 导入照片显示时间不是拍摄时间