maven的依赖特性,冲突解决(五)

1.maven依赖的几个特性

1.1 依赖范围 -scope标签spring

maven在构建过程有3套classpath,咱们会根据配置依赖的范围 依赖不一样的classpath,以下图:api

    

compile: 默认是compile,对 编译 测试 运行 都有效jsp

provided: 对编译和测试classpath有效,运行的时候不须要加入,例如 jsp 依赖 searvlet api ,好比咱们在编译和测试的时候有效可是在运行的时候  容器已经提供servletapi,若是加入会形成冲突maven

runtime: 只在测试和运行时 有效,比较典型的例子 jdbc api,只有在启动代码测试或者运行的时候才会启用ide

test: 只会在测试时有效,比较典型例子 就是junit ,只有再测试的时候 才会启用测试

    1.2 依赖传递spa

好比咱们引入某一个依赖spring-test,依赖传递特性会很方便帮助咱们下来它相关的依赖,而没必要有时会由于引入jar有问题而烦恼,可是也有弊端,存在一些没必要要的依赖,可能会形成冲突。.net

    

   1.3 依赖排除 -exclusion标签插件

 依赖排除的特性 也是为了解决依赖冲突的一个方法,很方便去除依赖传递过程当中没必要要的依赖。在下面依赖冲冲突会用到 该标签。3d

    

    1.4 依赖冲突产生缘由

使用maven久了会发现存在依赖冲突的问题,因为依赖的传递特性会引入不少隐式的依赖和现有显示jar版本     所冲突,从而形成版本冲突的问题。要解决这个问题,首先就是要查看pom.xml显式和隐式的依赖类包,       而后经过这个类包树找出咱们不想要的依赖类包,手工将其排除在外就能够了。

2.依赖冲突的解决

  2.1两个基本原则:

    1).短路优先原则

        A->B->logback-1.0.jar
        A->logback-1.1.jar

     2).先声明先优先原则(先解析先引用)
       与项目A pom中配置 引用坐标的顺序有关,若是依赖B在C前的话 就优先B,反之...

       A->B->logback-1.0.jar
       A->C->logback-1.1.jar

    2.2 演示两个原则

    1).建立三个maven工程  

        maven-01,maven-02,maven-03

    2).三个工程依赖结构: 

      maven-01依赖 spring-test,maven-02,maven-03 (maven-02/03须要首先提交本地仓库,maven-01才能找到 ,能够参考寻找构件过程:1.3 仓库寻找构件过程) ;

      maven-02依赖commons-logging-1.1.1;

      maven-03工程依赖 commons-logging-1.1.3

     3).看下myEclipse或者执行mvn dependency:tree 查看依赖树:

     myeclispe:依赖树

    

  4).冲突解决办法:

   4.1  pom配置1:

Xml代码 

1.  <dependency>&nbsp;&nbsp;
2.  &nbsp;&nbsp;&nbsp;&nbsp;<groupid>org.springframework</groupid>&nbsp;&nbsp;
3.  &nbsp;&nbsp;&nbsp;&nbsp;<artifactid>spring-test</artifactid>&nbsp;&nbsp;
4.  &nbsp;&nbsp;&nbsp;&nbsp;<version>4.2.2.RELEASE</version>&nbsp;&nbsp;
5.  &nbsp;&nbsp;&nbsp;&nbsp;<!-- 依赖排除 能够排除对commons-logging 的依赖  
6.      <exclusions>  
7.          <exclusion>  
8.              <groupId>commons-logging</groupId>  
9.              <artifactId>commons-logging</artifactId>  
10.          </exclusion>  
11.      </exclusions>  
12.      -->&nbsp;&nbsp;
13.  </dependency>&nbsp;&nbsp;

15.  <!-- 添加对maven-02依赖 -->&nbsp;&nbsp;
16.  <dependency>&nbsp;&nbsp;
17.  &nbsp;&nbsp;&nbsp;&nbsp;<groupid>com.sohu.train</groupid>&nbsp;&nbsp;
18.  &nbsp;&nbsp;&nbsp;&nbsp;<artifactid>maven-02</artifactid>&nbsp;&nbsp;
19.  &nbsp;&nbsp;&nbsp;&nbsp;<version>1.0-SNAPSHORT</version>&nbsp;&nbsp;
20.  </dependency>&nbsp;&nbsp;

  短路优先原则:

         maven-01->spring-test->spring-core->commons-loggings-1.2(依赖深度3)

         maven-01->maven-02->commons-loggings-1.1.1(依赖深度2)

         因此maven01工程依赖的commons-loggings-1.1.1

  

   4.2 pom配置2:

Xml代码 

1.  <dependency>&nbsp;&nbsp;
2.  &nbsp;&nbsp;&nbsp;&nbsp;<groupid>org.springframework</groupid>&nbsp;&nbsp;
3.  &nbsp;&nbsp;&nbsp;&nbsp;<artifactid>spring-test</artifactid>&nbsp;&nbsp;
4.  &nbsp;&nbsp;&nbsp;&nbsp;<version>4.2.2.RELEASE</version>&nbsp;&nbsp;
5.  &nbsp;&nbsp;&nbsp;&nbsp;<!-- 依赖排除 -->&nbsp;&nbsp;
6.  &nbsp;&nbsp;&nbsp;&nbsp;<exclusions>&nbsp;&nbsp;
7.  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<exclusion>&nbsp;&nbsp;
8.  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<groupid>commons-logging</groupid>&nbsp;&nbsp;
9.  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<artifactid>commons-logging</artifactid>&nbsp;&nbsp;
10.  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</exclusion>&nbsp;&nbsp;
11.  &nbsp;&nbsp;&nbsp;&nbsp;</exclusions>&nbsp;&nbsp;
12.  </dependency>&nbsp;&nbsp;

14.  <!-- 添加对maven-03依赖  -->&nbsp;&nbsp;
15.  <dependency>&nbsp;&nbsp;
16.  &nbsp;&nbsp;&nbsp;&nbsp;<groupid>com.sohu.train</groupid>&nbsp;&nbsp;
17.  &nbsp;&nbsp;&nbsp;&nbsp;<artifactid>maven-03</artifactid>&nbsp;&nbsp;
18.  &nbsp;&nbsp;&nbsp;&nbsp;<version>0.0.1-SNAPSHOT</version>&nbsp;&nbsp;
19.  </dependency>&nbsp;&nbsp;

21.  <!-- 添加对maven-02依赖 -->&nbsp;&nbsp;
22.  <dependency>&nbsp;&nbsp;
23.  &nbsp;&nbsp;&nbsp;&nbsp;<groupid>com.sohu.train</groupid>&nbsp;&nbsp;
24.  &nbsp;&nbsp;&nbsp;&nbsp;<artifactid>maven-02</artifactid>&nbsp;&nbsp;
25.  &nbsp;&nbsp;&nbsp;&nbsp;<version>1.0-SNAPSHORT</version>&nbsp;&nbsp;
26.  </dependency>&nbsp;&nbsp;

   先引用先优先的原则:

         maven-01->spring-test->spring-core

         maven-01->maven-02->commons-logging-1.1.1

         maven-01->maven-03->commons-logging-1.1.3

 若是pom先依赖maven-02则 依赖commons-logging-1.1.1 依赖;反之,若是pom先依赖maven-03则 依赖commons-logging-1.1.3 依赖

maven系列文章: 

  1).maven的安装及经常使用命令(一)

  2).maven的生命周期,插件介绍(二)

  3).maven的坐标,仓库介绍及配置(三)

  4).maven的pom介绍及配置(四)

  5).maven的依赖特性,冲突解决(五)

  6).maven的聚合模块和pom继承使用(六)

  7).maven的版本规范(七)

相关文章
相关标签/搜索