一点一点学maven(07)——maven依赖(范围、传递、排除、冲突)

1、依赖范围

依赖范围由<dependency></dependency>标签中<scope></scope>标签来定义。

项目如果要使用某个框架或依赖,需要把相关jar包引用到classpath中,maven项目提供了三个classpath:编译、测试、运行。

依赖的范围用于控制依赖于三种classpath关系的,包括:compile、provided、runtime、test、system、import

   compile:默认范围,编译、测试、运行都有效
   provided:编译和测试有效,最后运行不会被加入,如tomcat依赖
   runtime:在测试和运行的时候有效,编译不会被加入,比如jdbc驱动jar
   test:测试阶段有效,比如junit
   system:与provided一致,编译和测试阶段有效,但与系统关联,可移植性差
   import:导入的范围,它只是用在dependencyManagement中,表示从其它的pom中导入dependency的配置

例如:

<dependency>
      <groupIdjunit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <!-- 只在测试阶段使用该依赖 -->
      <scope>test</scope>
</dependency>
        <!-- 只在编译、测试期有效,在运行期无效,运行期使用tomcat容器自己的jar包 -->
        <!-- servlet support -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <!-- jsp support -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>

2、依赖传递

比如:A项目依赖B,B项目依赖C,此时C项目就会传递到A项目中。

C项目:

  <groupId>com.jsun.test</groupId>
  <artifactId>C</artifactId>
  <version>0.0.1-SNAPSHOT</version>

B项目:

    <dependency>
      <groupId>com.jsun.test</groupId>
      <artifactId>C</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>

A项目:

    <dependency>
      <groupId>com.jsun.test</groupId>
      <artifactId>B</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>

查看项目maven依赖列表,如图:
这里写图片描述

C项目自动被引入到A项目中,这就是依赖传递的结果。

3、依赖排除

如果此时,A项目依赖B项目,无需依赖C项目,那么需要把自动传递的依赖排除掉,通过<exclusions>标签实现。
A项目引用B项目依赖时,主动排除传递的C项目依赖,修改A项目pom.xml
代码:

<dependency>
      <groupId>com.jsun.test</groupId>
      <artifactId>B</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <exclusions>
        <exclusion>
          <groupId>com.jsun.test</groupId>
          <artifactId>C</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

还可以通过,C项目被B项目引用时,主动禁止自己被传递,只在B项目中使用,通过<optional>true</optional>实现,修改B项目的pom.xml:

    <dependency>
      <groupId>com.mavan.demo</groupId>
      <artifactId>C</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <optional>true</optional>
    </dependency>

效果如图:
这里写图片描述

A项目的maven依赖列表中只有B项目,而C项目自动被排除了。


补充:如果想把当前依赖的所有传递依赖排除掉,可以使用通配符*

<dependency>
      <groupId>com.jsun.test</groupId>
      <artifactId>B</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <exclusions>
        <exclusion>
          <groupId>*</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

4、依赖冲突

依赖引用有两个原则:

1)、短路优先原则:优先引用路径短的依赖
比如现在有两个依赖路径:(1)A–>B–>C–>X.1,(2)A–>B–>X.2,则(2)路径被优先解析,A项目使用X的版本为X.2版本。

比如A项目依赖B项目,B项目依赖C项目,B项目依赖commons-io的2.4版本,C项目依赖commons-io的2.0版本,则A项目的maven依赖列表中出现的是commons-io的2.4版本:
B项目:

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

C项目:

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.0</version>
    </dependency>

maven依赖列表如图:

这里写图片描述

2)、路径相同,先声明优先原则

比如,A项目依赖B项目,A项目依赖C项目,B、C项目分别依赖commons-io的2.4和2.0版本,A项目引用B、C依赖时,C引用放在B前面,则A使用的是commons-io的2.0版本。

B项目:

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

C项目:

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.0</version>
    </dependency>

A项目:

    <dependency>
      <groupId>com.jsun.test</groupId>
      <artifactId>C</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>com.jsun.test</groupId>
      <artifactId>B</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>

查看A项目maven依赖列表,如图:

这里写图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值