Maven实战笔记-依赖

依赖配置

根元素 project 下的 dependencies 可以包含一个或者多个 dependency 元素,以声明一个或者多个项目依赖。

  • groupId、artifactId 和 version:依赖的基本坐标。
    大部分依赖声明支持包含基本坐标,一些特殊情况下,会使用以下元素。
  • type:依赖的类型,对应于项目坐标定义的 packaging。默认值为 jar。
    scope:依赖范围。默认值为 compile。
  • optional:标记依赖是否可行。
  • exclusion:用来排除传递性依赖。

依赖范围

依赖范围与 classpath 的关系

依赖范围(scope) 对于编译 classpath 有效 对于测试 classpath 有效 对于运行时 classpath 有效 例子
compile Y Y Y spring-core
test -- Y -- JUnit
provided Y Y -- servlet-api
runtime -- Y Y JDBC 驱动实现
system Y Y -- 本地的,Mave 仓库之外的类库文件。慎用!
import 导入依赖范围。不会对三种 classpath 产生实际的影响。

传递性依赖

何为传递性依赖

A 有一个 compile 范围的 B 依赖,B 有一个 compile 范围的 C 依赖,那么 C 就会成为 A 的 compile 范围依赖,C 是 A 的一个传递性依赖。


image.png

依赖性传递和依赖范围

最左一列表示第一直接依赖范围,最上面一行表示第二直接依赖,中间的交叉单元格表示传递性依赖范围。

compile test provided runtime
compile compile -- -- runtime
test test -- -- test
provided provided -- provided provided
runtime runtime -- -- runtime

依赖调节

依赖调节原则

  • 第一原则:路径最近者优先
    如:A -> B -> C -> X(1.0)、A -> D -> X(2.0),则X(2.0)会被解析使用。
  • 第二原则:第一声明原则(Maven 2.0.9 开始)
    如:A -> B -> X(1.0)、A -> C -> X(2.0),依赖路径长度相同时,使用在 POM 中依赖声明最靠前的依赖。

可选依赖

根据传递性依赖中的例子:

A 有一个 compile 范围的 B 依赖,B 有一个 compile 范围的 C 依赖,那么 C 就会成为 A 的 compile 范围依赖,C 是 A 的一个传递性依赖。

如果 C 是可选依赖(optional=true),则依赖 C 将不会传递给 A。下图中的 X、Y 可设为 C。


image.png


    4.0.0

    com.juvenxu.mvnbook.account
    project-b
    1.0-SNAPSHOT
    
        
            mysql
            mysql-connector-java
            5.1.10
            true
        
        
            postgresql
            postgresql
            8.4-701.jdbc3
            true
        
    

排除依赖

image.png

你可能感兴趣的:(Maven实战笔记-依赖)