武三通最近收养了一个义女,叫阿沅,此女自幼父母双亡,十分孤苦,武三通对他一直疼爱有加,不光教她武术,还教她编程,想着日后等阿沅长大了,也可以当个程序媛什么的,作为谋生的本领。

一日,阿沅正一个人鼓捣着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

(长按或扫码识别)

武林外传—阿沅,这是依赖传递呀!相关推荐

  1. maven 的依赖传递

    1.   首先就maven的依赖传递来说:只有<scope>compile</scope>时,才能进行依赖的传递,其他的范围没有依赖传递可言!!! 2.   当依赖级别相同时, ...

  2. Maven中 jar包冲突原理与解决办法依赖传递

    Maven中 jar包冲突原理与解决办法&依赖传递 管理包依赖是 Maven 核心功能之一,下面通过如何引入 jar 包:如何解析 jar 包依赖:包冲突是如何产生:如何解决包冲突:依赖管理解 ...

  3. maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile

    maven是当前Java项目中用到最多的依赖管理工具.最开始的项目比较小引入的依赖包也少所以可以通过手动加载jar包的方式来管理依赖包:但随着项目越来越复杂各种大小框架层出不穷,一个项目的开发往往依赖 ...

  4. 【Android Gradle 插件】Android 依赖管理 ⑥ ( 依赖冲突处理 | transitive 依赖传递设置 | exclude 依赖排除设置 | force 强制指定依赖库 )

    文章目录 一.查询 Android 依赖库的配置 二.通过 ModuleDependency#transitive 依赖传递设置 三.通过 ModuleDependency#exclude 设置排除子 ...

  5. 用exclusion切断maven jar包的依赖传递

    1.问题描述 proxool  包依赖的avalon-framework-api包,如何切断这种依赖关系呢? 2.解决方法 在pom文件中,通过exclusion标签,切断maven jar包的依赖传 ...

  6. 02-Maven高级-分模块开发、依赖传递、聚合、继承(SpringBoot的部分底层原理)、多模块开发(环境切换)、Nexus私服搭建与使用

    文章目录 学习目标 一.分模块开发与设计 1. 分模块开发的意义 问题导入 模块拆分原则 2. 分模块开发(模块拆分) 问题导入 2.1 创建Maven模块 2.2 书写模块代码 2.3 通过mave ...

  7. 【热门框架】Maven依赖传递,可选依赖以及排除依赖指的是什么?有什么意义?

    Maven依赖传递是指当一个项目依赖另一个项目时,Maven会自动下载并构建这些依赖项,同时还会将这些依赖项所依赖的其他项一并下载并构建.这个过程会一直递归下去,直到所有依赖的项都被下载并构建完成.这 ...

  8. maven依赖管理(依赖配置、依赖传递、依赖冲突、依赖范围)

    文章目录 基本说明 依赖配置 依赖传递 直接依赖 间接依赖 依赖冲突 路径优先 声明优先 特殊依赖 可选依赖 排除依赖 可选依赖和排除依赖区别 依赖范围 总结 基本说明 这篇文章会介绍在maven中的 ...

  9. Maven依赖配置、依赖传递和依赖范围。

    一.依赖传递. 依赖具有传递性: 1.直接依赖:在当前项目中通过依赖配置建立的依赖关系. 2.间接依赖:被资源的资源如果依赖其他资源,当前项目简介依赖其他资源. 3.依赖传递冲突问题: 路径优先:当依 ...

最新文章

  1. matplotlib生成指定大小的空白的白色图(故意保存)实战:当然也可以保存正常的有内容的图像
  2. 美空管官员:政府停摆致人手不足 危及航空安全
  3. Selenium+TestNG+Jenkins 框架图形化UML表示
  4. 职业标准体系一般有几个层次划分_全国首个粤菜标准体系规划发布
  5. 分布式与人工智能课程(part14)--深度学习
  6. 独家 | 蚂蚁金服TRaaS技术风险防控平台解密
  7. 谈谈女友卸妆后的感受?
  8. java jndi使用_Java项目中使用JNDI连接数据库
  9. NLP《词汇表示方法(三)word2vec》
  10. c mysql用户登录_SQL语句及5.7.2 mysql 用户管理 c_G
  11. 京东发布全球物流无人机研报:美国领先、非洲政策最开放,中国产业链全景最复杂...
  12. java 合并对象中属性_Java2个对象形集合按某一个属性合并
  13. 计算机数字雨教程视频,股票配资火爆cmd什么意思(cmd命令数字雨)
  14. 怎么让自媒体文章原创度变高?原创度达到多少才算合格?
  15. C4D R23 安装教程
  16. PAT 1055 集体照 python
  17. 计算机无法安装hp网络打印机,hp打印机驱动安装失败怎么办 hp打印机驱动安装失败的解决办法...
  18. 32、T5L 迪文屏 C51开发之数据存储模型
  19. 自己的微信小程序学习笔记【1】——小程序开发工具的使用及项目文件说明
  20. iPhone 导入照片显示时间不是拍摄时间

热门文章

  1. JavaScript诞生二十年,作者Brendan Eich自述10天内开发出JS语言
  2. PG 利用FDW的水平分片
  3. el-card实现菜单栏效果
  4. Quill编辑器实现图片上传功能
  5. 51单片机烟雾传感器C语言程序,51单片机烟雾报警器制作+程序
  6. 爬虫:一种打破3000套限制爬取所有链家二手房源的方法
  7. python for ArcGIS 绘制南京市板块地图
  8. 美学心得(第二百四十二集) 罗国正
  9. 中企故事汇:铁匠之乡借东风出海
  10. 20200731 SCOI模拟T3(线段树分治)