maven学习系列4----依赖

依赖配置

前面几篇文章中都有提到依赖构建的配置,但是没有详细说明,并且只给出了最基本的配置,还有一些常用的配置项没有体现,这里面将详细说明依赖配置各选项的意义及配置方法,如下:

  <dependencies>
  <span style="white-space:pre">	</span><dependency>
  <span style="white-space:pre">		</span><groupId>junit</groupId>
  <span style="white-space:pre">		</span><artifactId>junit</artifactId>
  <span style="white-space:pre">		</span><version>4.12</version>
        <span style="white-space:pre">	</span><type></type>
  <span style="white-space:pre">		</span><scope>test</scope>
        <span style="white-space:pre">	</span><classifier></classifier>
        <span style="white-space:pre">	</span><optional></optional>
        <span style="white-space:pre">	</span><exclusions>
            <span style="white-space:pre">		</span><exclusion>
            <span style="white-space:pre">		</span></exclusion>
        <span style="white-space:pre">	</span></exclusions>
  <span style="white-space:pre">	</span></dependency>
  </dependencies>
说明:

  • groupip/artifactid/version/type/classifier是构件的坐标五元素,其中type对应packageing
  • scope配置依赖的范围
  • optional配置此依赖是否为可选
  • exclusions用来排除传递性依赖


依赖范围

maven在编译项目主代码的时候使用一套classpath,编译及执行测试代码时使用另外一套classpath,而项目在运行的时候又会使用第三套classpath,而依赖范围就是用来控制依赖与这三种classpath的关系的。如下

说明

  • compile/test/runtime三个比较好理解,对应编译、测试、运行
  • provided表示运行过程中依赖已经默认提供,而编译和测试的时候才需要,例如servlet-api,项目运行时容器已经提供,所以不需要在运行阶段引入此依赖。
  • system表示系统依赖,例如系统中安装的jdk的相关jar包,此依赖与本机系统绑定,会造成不可移植性,所以需要慎用。
  • maven2.0.9及后续版本中还有一个叫做导入(import)的依赖范围,因为在继承中使用,所以在学习继承特性的时候再详细说明。


传递性依赖

1,概念

假设A依赖于B,B依赖于C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。这样A项目中可以不用配置对C的依赖,maven会自动处理这种传递性依赖。极大的简化了项目依赖的管理。

2,传递性依赖对依赖范围的影响

假设最左边一列表示第一依赖范围,第上面一行表示第二依赖依赖范围,交叉位置表示传递性依赖范围,其关系如下图


规律:

  • 第二直接依赖为runtime,第一依赖为compile的时候,传递性依赖范围为runtime,这个特殊一些
  • 第二直接依赖为compile和runtime的时候,传递性依赖范围与第一直接依赖范围一致(除了第一条中特殊的情况)
  • 第二直接依赖为test的不会传递
  • 第二直接依赖为provided的只传递第一直接依赖也是provided的依赖,传递性依赖范围也是provided


3,可选依赖对传递性依赖的影响

可选依赖就是对应<optional/>标签

可选依赖不会传递,所以当A依赖于B,B依赖于C(C是可选依赖时),当A也需要依赖C的话就需要在A项目中显示的配置对C的依赖。

可选依赖主要用于这种场景:B实现了两个特性,其中一个特性依赖于C,第二个特性依赖于D,而这两个特性是互斥的,用户不可能同时使用两个特性。

(个人觉得这个特性使用的很少,因为项目启动阶段基本上选型已经OK,而在一个项目中实现两个互斥的特性总觉得很奇怪。)


4,排除依赖

排除依赖可以通过<exclusions/>来实现,当A依赖于B,而B依赖于C(版本为v1),由于其他原因项目A中不想使用v1版本的C,而想使用v2版本的C时,就可以使用排除依赖这个特性了。例如:

  <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.hamcrest</groupId>
                <artifactId>hamcrest-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-core</artifactId>
        <version>1.3.RC2</version>
    </dependency>
  </dependencies>

junit-4.12依赖于hamcrest-core-1.3版本,这里改成了依赖hamcrest-core-1.3.RC2版本了(只是为了说明这种特性的配置方法,实际项目中不一定会使用)。


5,依赖相关的几个命令

在命令行中可以执行以下几个命令来查看依赖相关信息

mvn dependency:list

mvn dependency:tree

mvn dependency:analyze


附:

《maven实战》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值