美文网首页
武林外传—阿沅,这是依赖传递呀

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

作者: 九九派 | 来源:发表于2018-11-03 12:20 被阅读2次

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

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

    相关文章

      网友评论

          本文标题:武林外传—阿沅,这是依赖传递呀

          本文链接:https://www.haomeiwen.com/subject/yhvmtqtx.html