maven依赖机制简介

maven依赖机制官方文档


可传递的依赖,maven 会自动包含那些你直接依赖的库所需要的依赖库,前提是那些被简介依赖的库是可传递的;
基于这个特性,需要有以下这些规定:(解决版本冲突)

1,依赖性调解

决定了当遇到多个版本作为依赖项时,哪个版本作为依赖项。默认的是 "**最接近定义**";
a->b->c->d1
a->e->d2

d2离a 比 d1离 a 近,则 d2被作为依赖版本
a->b->c->d1
a->f->g->d2
d1比d2先出现,依赖d1
a->b->c->d1
a->e->d2
a->d1
a中直接依赖d1,依赖d1

2,依赖关系管理

即使A没有直接引用d1,但是可以直接在 dependencyManagement 显示声明d1的版本,这样当遇到D的依赖时,就会使用d1的版本;

3,依赖范围

编译时vs运行时类路径
compile:默认的依赖范围,当不指定scope时使用。它是可传递的;项目中所有的类路中都有 compile 范围的依赖项。
provided:它表示你所需要的依赖由jdk或者容器提供。例如servlet api的依赖由web容器提供,它参与编译,测试,与运行阶段;它是不可传递的,它不会添加到运行时类路径;
system:等同于provided
runtime:此范围表示编译时不需要依赖项,但是执行时需要依赖项。Maven 在运行时和测试类路径中包含具有此作用域的依赖项,但不包含编译类路径;她是可传递的。
test:这个范围表明,该依赖项对于应用程序的正常使用是不必要的,并且仅对于测试编译和执行阶段可用。这个范围是不可传递的。这个范围通常用于测试库,如 JUnit 和 Mockito。如果这些库用于单元测试(src/test/java) ,而不用于模型代码(src/main/java) ,那么它也可以用于非测试库。
import:仅用在 dependencyManagement 中 type为pom类型的依赖;它不限制依赖项的传递性,当被真的需要依赖时会传递到上层项目中。
除了import外,scope会以各自的方式影响传递依赖;
依赖传递
第一列表示直接依赖的cope,第一行是直接依赖模块的直接依赖的scope。

4,排除依赖项

使用 exclude 排除你直接依赖的资源的所依赖的依赖。如果项目 x 依赖于项目 y,而项目 y 依赖于项目 z,那么项目 x 的所有者可以使用“ exclusion”元素将项目 z 显式排除为依赖项。

5,可选依赖项

y依赖于z。某些情况下,你只希望z对y是可见的,而对于x是不可见,所以y项目的使用者可以使用 option 将z的项目作为可选选项。当x依赖y时,可以根据需要在显示依赖z。option与conditionOnClass的妙用

ext

相对于依赖的传递,有 最接近定义,实际上属性也是,我们在自己顶层项目中制定的属性,如果和所有引用的项目的属性有冲突,则使用的是本项目的定义的属性;比如最近的log4j2的版本升级,我们可以在项目中定义属性 log4j2.version 为安全的版本,那么项目中spring boot 引入的log4j2的版本就是我们指定的版本;原因在 spring-boot-dependencies 中 定义并使用了这个属性

 	<dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>${log4j2.version}</version>
      </dependency>

在spring-boot-starter-logging 中有依赖到改依赖管理中定义的依赖;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值