1.Maven中依赖概述

Maven中的依赖关系是有传递性的。例如:项目B依赖项目C(B —> C),如果有一个项目A依赖项目B(A —> B)的话,那么项目A也会依赖项目C(A —> C)。虽然,这种依赖的自动传递性给我们维护项目的必要依赖关系带来了极大地帮助,但当我们在某些情况下,需要在项目A中排除对项目C的依赖时,这时又该怎么做呢?Maven 为我们提供了两种解决方案,分别是可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)。

2.哪些场景需要排除依赖

我们继续用上文中的例子,虽然项目A依赖项目B,但当项目A不是完全依赖项目B的时候,即项目A只用到了项目B的一部分功能,而正巧项目B这部分功能的实现,并不需要依赖于项目C,这个时候,项目A就应该排除对项目C的依赖。

有的人可能有这样的疑问,为什么要排除对项目C的依赖呢?就算包含了对项目C的依赖,也不会出问题啊。事实上,表面上看确实不会出现问题。但是,我们必须记住一点:当我们使用一个工程时,控制实际需要的依赖列表非常重要。而且,排除不必要的依赖还可以帮助我们,节约磁盘、内存等空间,避免许可协议问题以及类路径问题等。我们在享受Maven依赖的自动传递性带给我们的便利的同时,要时刻注意引入冗余、不必要的依赖对我们项目产生的负面影响。

3.可选依赖(Optional Dependencies)—— optional

从项目B入手,使项目A依赖项目B时,排除对项目C的依赖。项目B的配置片段如下:

<project>...<dependencies><dependency><groupId>sample.ProjectC</groupId><artifactId>Project-C</artifactId><version>1.0</version><scope>compile</scope><optional>true</optional></dependency></dependencies>
</project>

在项目A中按照正常的方式引入对项目B的依赖即可,这个时候,项目A就不会依赖项目C了。如果项目A用到了项目B中涉及项目C的功能,则需要在项目A的 pom.xml 文件中额外配置对项目C的依赖。

应用场景:假设有一个项目X,它实现了类似Hibernate的功能,支持很多种数据库驱动,例如:mysql,oracle等。我们在构建项目X的时候,确实需要所有这些依赖。但设想,假如有一个项目Y想使用项目X提供的功能,那么它极有可能只使用其中的一种数据库驱动。这个时候,就需要我们在项目X中将所有和驱动相关的依赖设置为可选依赖。只有这样,在项目Y中声明项目X为直接依赖的时候,才不会将项目X的所有关于驱动的依赖自动引入。这时,项目Y只需要额外声明自己真正需要依赖的驱动即可。

4.依赖排除(Dependency Exclusions)—— exclusion

接上文例子,如果项目B没有把项目C设置为可选依赖(Optional Dependencies),而项目A又想在依赖项目B的同时不依赖项目C,应该如何操作呢?这个时候,我们使用依赖排除(Dependency Exclusions)就可以达到目的。此时,项目B按照正常的方式引入对项目C的依赖,项目A在引入对项目B的依赖时,配置如下:

<project>...<dependencies><dependency><groupId>sample.ProjectB</groupId><artifactId>Project-B</artifactId><version>1.0</version><scope>compile</scope><exclusions><exclusion> <groupId>sample.ProjectC</groupId><artifactId>Project-C</artifactId></exclusion></exclusions> </dependency></dependencies>
</project>

应用场景:接上文例子,假如项目X并没有将所有对驱动的依赖设置为可选依赖(Optional Dependencies),那么项目Y直接引入对项目X的依赖时,就会将项目X中所有对驱动的依赖一起引入。这时候,就需要我们在引入项目X时通过依赖排除(Dependency Exclusions)去除掉我们不需要的那些依赖。

需要注意的是,依赖排除(Dependency Exclusions)是基于单个依赖的,并不是POM级别的。也就是说,虽然,项目A在引入对项目B的依赖时,排除了对项目C的依赖。但,并不影响项目A在其他地方引入对项目C的依赖。例如,项目A又引入了对项目D的依赖,而项目D依赖项目C,这个时候,项目A就又产生了对项目C的依赖。
另外,在Maven引入的jar包发生冲突时,也往往需要借助依赖排除(Dependency Exclusions)来解决。

Maven中的可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)相关推荐

  1. Maven中可选依赖(optional)和依赖排除(exclusion)的用法

    前面必读的话 Optional和Exclusions都是用来排除jar包依赖使用的,两者在使用上却是相反.Optional表示可选择的,Exclusions表示排除 Optional定义后,该依赖只能 ...

  2. maven 对于java的要求_如何在Maven中表达对Java EE功能的依赖以过渡到Java 9?

    该模块系统讲的无名模块作为在从类路径加载应用的情况下构建模块图的方式.此外,从文档本身来看: 当编译器在未命名模块中编译代码,或者调用Java启动程序并将应用程序的主类从类路径加载到应用程序类加载器的 ...

  3. iOS开发笔记之九十四——Swift中的可选类型Optional

    一.Optional类型的概念 Swift中为何要引入Optional的概念,官方文档中有介绍: Swift also introduces optional types, which handle ...

  4. 查找maven中任意一个jar包被哪个包依赖

    背景 收到公司代码检测发来的消息,说是项目中引入的某个jar包版本过低存在安全问题,需要升级,但是,笔者硬是找了半天都没有找到是哪个地方引入了这个jar. 现在问题就是需要找到是哪里引入的这个包,并将 ...

  5. Maven中optional和exclusion的区别

    用了那么久的Maven,我们都知道Maven的依赖关系具有传递性,比如A依赖B,B依赖C,那么A也依赖于C,具体在项目中的表现见图: 上述依赖在pom.xml中的关系是这样的: C(cc-spring ...

  6. maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile

    maven是当前Java项目中用到最多的依赖管理工具.最开始的项目比较小引入的依赖包也少所以可以通过手动加载jar包的方式来管理依赖包:但随着项目越来越复杂各种大小框架层出不穷,一个项目的开发往往依赖 ...

  7. 二:Maven中pom.xml元素详解

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6628201.html  一个pom.xml中包含了许多标签,各个标签是对项目生命周期.依赖管理的配置.常用的主 ...

  8. 如何搭建maven中,分布式工程

    主要流程: 创建forework-parent pom 工程 公司级别的库 选取 然后 next Finish 点击完成 导入pom.xml 依赖库 <project xmlns="h ...

  9. 关于batik库在Maven中版本问题

    最近在使用HighCharts进行图标统计分析的时候,客户要求对生成的统计结果图可以导出到Excel查看. 通过查看相关资料,在得知HighCharts通过SVG生成图标文件信息,那思路就基本确定了, ...

最新文章

  1. Linux centos7 NMAP网络探测工具安装过程以及使用示例!
  2. 影像组学视频学习笔记(14)-特征权重做图及美化、Li‘s have a solution and plan.
  3. 剑指offer---11---二进制中1的个数
  4. Elasticsearch聚合初探——metric篇
  5. VS2005水晶报表发布
  6. Blazor带我重玩前端(四)
  7. mysql对本地文件的读取_Mysql 任意读取客户端文件
  8. SSL *** vs IPSEC ***
  9. 图解Visual Studio 2010中的UML建模功能
  10. java的write无法写入,Java加载ImageIO.write的文件在.jar中不起作用
  11. angular 表单操作
  12. ASP.NET 教程
  13. 【云速建站】域名配置指导
  14. Adaptive Graph Convolutional Neural Networks
  15. WPF学习第十一集-深入浅出话模板
  16. Mip-NeRF学习
  17. WKID对照表:Projected Coordinate Systems
  18. 计算机画图怎么画荷花图片简笔画,画荷花最简单的画法 荷花画图片简单画法...
  19. UML设计java程序_利用UML序列图设计Java应用程序详解
  20. 汉字区位码、机内码学习笔记

热门文章

  1. HCIP-第十二天-MPLS+VNP
  2. 第四周项目1建立单链表
  3. 使用Java实现高效的字符串匹配算法
  4. Word2021 常用基本操作
  5. 微信多开设置网络代理服务器,还在玩微信双开吗?你out了,哥教你三开四开无数开...
  6. excel怎么能把字竖着打出来_如何在EXCEL中竖着打出字来?又如何把字 – 手机爱问...
  7. xavier内存满了,无法开机解决方案
  8. 这篇文章,把我都快看哭了...
  9. python制作音乐相册_装逼篇 | 抖音超火的九宫格视频是如何生成的,Python 告诉你答案...
  10. 浙江省高中信息技术python_浙江省新高中信息技术教材,将围绕Python进行并增加编程相关知识点...