Maven依赖

9 篇文章 0 订阅
9 篇文章 2 订阅

Maven依赖的配置

依赖声明包含以下元素:

<project>
...
  <dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <scope></scope>
        <optional></optional>
          <exclusions>
            <exclusion>
              <groupId></groupId>
              <artifactId></artifactId>
            </exclusion>
          </exclusions>
    </dependency>
  </dependencies>
  ...
</project>

根元素project下的dependencies可以包含一个或多个dependency元素,为项目的依赖。
groupId, artifactId, version: 依赖的基本坐标。
type: 依赖类型,对应项目坐标的packaging, 大部分情况下,使用默认值jar。
scope: 依赖范围。
optional: 标记依赖是否可选。
exclusion: 用来排除传递性依赖。

scope 依赖范围

Maven项目在编译, 测试, 运行时使用不同的classpath。
依赖范围就是控制依赖于这三种classpath的关系。

  • compile
    编译依赖范围, 如没有指定,默认使用该依赖范围, 对编译,测试, 运行三种classpath都有效。
  • test
    测试依赖范围, 只对测试classpath有效,编译主代码和运行项目时无法使用此依赖。例如 JUnit, 只在编译测试代码和运行测试时才需要。
  • provided
    已提供依赖范围, 对编译和测试classpath有效, 运行时无效。例如servlet-api, 编译和测试项目的时候需要该依赖,运行时由于容器已提供,不需要重复引入。
  • runtime
    运行时依赖。对于测试和运行classpath有效,编译主代码无效。例如JDBC驱动实现,项目主代码编译时只需要JDK提供的JDBC接口,只有在执行测试或运行项目时才需要实现上述接口的具体JDBC接口。
  • system
    系统依赖范围。同provided依赖范围,使用system范围的依赖时,必须通过systemPath指定依赖文件。主要用于本地的,Maven仓库之外的类库文件。
  • import
    导入依赖范围。

传递性依赖

假设 A 依赖 B , B 依赖 C ,我们称 A 对 B 是第一直接依赖, B 对 C 是第二直接依赖, A 对 C 是传递依赖。
Maven会解析各个直接依赖的POM, 将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。

传递性依赖和依赖范围

依赖范围还对传递性依赖产生影响。
第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围。
如下表, 最左一列表示第一直接依赖范围, 最上面一行表示第二直接依赖范围, 中间交叉单元格表示传递性依赖范围。

-compiletestprovidedruntime
compilecompile--runtime
testtest--test
providedprovided-providedprovided
runtimeruntime--runtime

1. 当第二直接依赖是compile时,传递依赖范围与第一直接依赖范围一致
2. 当第二直接依赖是test时, 依赖不会传递
3. 当第二直接依赖是provided时,只传递第一直接依赖为provided的依赖,且传递依赖范围为provided
4. 当第二直接依赖是runtime时,传递依赖范围与第一直接依赖范围一致,compile例外,此时传递依赖的范围是runtime

依赖调解

Maven依赖调解(Dependency Mediation)的第一原则是:路径最近者优先。
例如:项目A的依赖关系: A -> B -> C -> X(1.0), A -> D -> X(2.0), 两个版本的X会造成依赖重复, X(1.0) 的路径长度是3, X(2.0)的路径长度是2, 因此, X(2.0)会被解析使用。
第二原则是: 第一声明者优先。
例如: A -> B -> Y(1.0), A -> C -> Y(2.0), 由于他们的路径长度相同。在POM中依赖声明的顺序决定了顺序靠前的那个依赖优先,该例中,如果B的依赖声明在C之前, 那么Y(1.0)会被解析使用。

可选依赖

< optional > 元素表示可选依赖
例如, A -> B, B -> X(可选), B -> Y(可选), 由于X 和 Y是可选依赖,依赖将不会传递,X 和 Y将不会对A有任何影响。

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
            <optional>true</optional>
        </dependency>
      <dependency>
          <groupId>postgresql</groupId>
          <artifactId>postgresql</artifactId>
          <version>8.4</version>
          <optional>true</optional>
      </dependency>

这个例子是一个数据库持久层隔离工具包, 支持多种数据库, 但是在使用这个工具包时,只会依赖一种数据库, 需要使用的数据库在项目中再显式的声明。

排除依赖

如果要排除传递性依赖引入的某个包, 需要使用 < exclusion> 元素。
exclusions可以包含一个或多个 exclusion 子元素。
exclusion只需要 groupId和artifactId, 不需要version元素, 只需要groupId和artifactId就能唯一的定位某个依赖。

查看Maven的依赖

查看maven依赖列表
mvn dependency:list
maven的依赖树
mvn dependency:tree
分析依赖
mvn dependency:analyze
分析编译主代码和测试代码需要用到的依赖。

地址:http://blog.csdn.net/yonggang7/article/details/79590813

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值