本文将介绍 Maven工程中3种避免依赖冲突的手段 provided,optional 和 exclusion 及其使用场景,并对其进行比较区分,最后以一个应用实例来做归纳总结。本人在网上寻找相关说明时大多语焉不详,模棱两可,有些甚至自己也没弄明白,故根据官方说明和自身试验写下此文,如有纰漏,还望指教。转载需经本人同意,注明出处方可转载。
一 介绍
为了方便叙述,以 项目B 为主体来讨论依赖与被依赖关系。
不管是provided,exclusion还是optional,都符合关系如下(虚线表示弱依赖)
下图表示在项目A没有直接依赖项目C的情况下,项目A都无法直接使用项目C,而项目B可以。
1 scope设为provided
- 核心
对象是依赖整体,依赖将提供编译而不参与打包,以使用方提供的为准,从而避免版本冲突 - 使用场景
希望协调依赖版本以使用方提供的为准 - 典型应用
项目B是我们要发布的组件,依赖于spring-boot 的部分功能(项目C),项目A要使用我们的组件,且项目A本身也是spring-boot项目,此时,对spring-boot的依赖极易出现版本冲突(项目A依赖的spring-boot版本可能经常变化)。此时就应以项目A的依赖为准,同时使得项目B也可以获得项目C升级的好处。如果不希望项目B依赖的项目C版本改变,则不应该用这种方式。 - 使用方法
项目B指定项目C的 dependency 下的 scope 为 provided - 图例
如下,项目B原本依赖项目C1,但在项目A中引入