微信号:java_daren

介绍:精通java技术;具备互联网思维,进可创业,退可求职谋生,本号正是为了召集和培养这样的达人.

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

2018-11-03 12:45 java达人


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

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

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

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

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

 
           
  1.  <dependency>

  2.            <groupId>cn.taoyuan</groupId>

  3.            <artifactId>sdk-client</artifactId>

  4.            <version>1.0-SNAPSHOT</version>

  5.            <scope>system</scope>

  6.            <systemPath>${project.basedir}/lib/sdk-client-1.0-SNAPSHOT.jar</systemPath>

  7. </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文件,

 
           
  1. <dependency>

  2.            <groupId>cn.taoyuan</groupId>

  3.            <artifactId>sdk-client</artifactId>

  4.            <version>1.0-SNAPSHOT</version>

  5. </dependency>

在屏幕上打出了:

 
           
  1. 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

(长按或扫码识别)


 
java达人 更多文章 还没毕业就被阿里30万年薪预定,他凭什么? 武林外传—武三通的zuul之惑 对JVM还一知半解?这篇文章让你彻底搞定JVM! 武林外传—一灯大师与众弟子漫谈Api网关选型 Spring声明式事务的一个注意点及原理简析
猜您喜欢 “美团点评”杯厦门大学软件开发大赛,王兴也来参加了 初见小米广告之Supply篇 零基础成为 Google 官方认证机器学习工程师,只需要2步? 那些关于浏览器的趣图和幽默段子 简易构建适合风控系统的ip库