Maven依赖管理总结

前言

Maven作为当下最流行的项目管理工具,其中核心功能就是依赖管理。本文主要总结Maven依赖管理中依赖范围和依赖冲突的解决。

依赖范围

依赖是maven项目引用的资源架包,依赖范围就是这些资源架包在maven项目中的作用范围,反过来说,maven项目通过依赖范围来控制何时引用资源架包。之前有介绍maven的默认生命周期,(compile,test,package,install,deploy)。maven的依赖范围用scope关键字表示,恰好也是五种,虽然不是和生命周期完整对应的,但是基于生命周期划分的。
在这里插入图片描述
通过下表可以知道依赖范围表示的作用域。

依赖范围 对于编译执行环境有效 对于测试执行环境有效 对于运行时执行环境有效 例 子
compile spring-core
test × × junit
provided × servlet-api
runtime × JDBC驱动
system × 本地的,Maven仓库之外的类库

compile:依赖范围默认值是compile,这是最常用的,如果maven项目中引入一个依赖,没有添加scope依赖范围,那么默认的就是compile,表示maven项目在编译,测试,运行阶段都需要引用该依赖。
test:表示该依赖包只和测试相关,测试代码的编译和运行会引用该依赖。
provided:表示maven项目只在编译和测试时引用该依赖,如果将项目打包运行时,则不会引入该依赖,如servlet-api,这是web项目常用的架包,在项目编译和测试时都需要用到该架包,如果项目需要运行,则需要将项目部署到tomcat或其他web服务器上,但是tomcat中自带了servlet-api,如果maven项目中引入了servlet-api,那么会和tomcat中的servlet-api产生冲突,所以可以使用provided限定servlet-api,让maven项目在打包时不再引入servlet-api.

runtime和system是不常用的。runtime表示在测试和运行阶段需要引入该依赖,在编译阶段不引入该依赖,如JDBC的驱动包,因为JDBC驱动是通过反射机制加载的,所以不参与项目编译过程。system的作用域和provided类似,表示引用仓库之外的依赖,需要通过systemPath指定本地依赖的路径,除了特殊情况基本不使用。

传递依赖冲突的解决

先了解一下传递依赖以及什么情况下会产生冲突。
传递依赖,如果项目A需要引入依赖包B,依赖包B又引入了依赖包C,那么B是A的直接依赖,C是A的传递依赖。如果项目A还需要引入依赖包D,依赖包D也引用了依赖包C,当依赖包B引用的C和依赖包D引用的C版本不同时,则发生了依赖冲突。
通过实例说明:一下是Spring的架构图(4.X版本的官方参考文档,5.X版本的没找到,地址:https://docs.spring.io/spring/docs/4.3.21.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#overview-modules)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值