前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >武林外传—阿沅,这是依赖传递呀!

武林外传—阿沅,这是依赖传递呀!

作者头像
java达人
发布2018-12-06 10:14:09
3590
发布2018-12-06 10:14:09
举报
文章被收录于专栏:java达人

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

一日,阿沅正一个人鼓捣着pom文件,仿佛遇见了什么问题,总是鼓捣不出来,她叫到:“义父,这些jar包怎么也引不进来呀!”

武三通闻讯而至,道:“小阿沅,遇到什么难题了。”

阿沅指着屏幕道:“义父,你看!”

武三通背着手,凑近看,道:“嘿,你这个jar包是这样引入的呀。”

代码语言:javascript
复制
<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文件,

代码语言:javascript
复制
<dependency>
            <groupId>cn.taoyuan</groupId>
            <artifactId>sdk-client</artifactId>
            <version>1.0-SNAPSHOT</version>
</dependency>

在屏幕上打出了:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档