武三通最近收养了一个义女,叫阿沅,此女自幼父母双亡,十分孤苦,武三通对他一直疼爱有加,不光教她武术,还教她编程,想着日后等阿沅长大了,也可以当个程序媛什么的,作为谋生的本领。
一日,阿沅正一个人鼓捣着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包时可以用 <exclusions>排除,这个你也看过。”
“那如果发生了依赖冲突怎么办,依赖传递的时候引入同名,版本不同的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达人:
drjava
网友评论