我们知道,maven的依赖关系是有传递性的。如:A-->B,B-->C。但有时候,项目A可能不是必需依赖C,因此需要在项目A中排除对A的依赖。在maven的依赖管理中,有两种方式可以对依赖关系进行,分别是可选依赖(Optional Dependencies)以及依赖排除(Dependency Exclusions)。

一、可选依赖

当一个项目A依赖另一个项目B时,项目A可能很少一部分功能用到了项目B,此时就可以在A中配置对B的可选依赖。举例来说,一个类似hibernate的项目,它支持对mysql、oracle等各种数据库的支持,但是在引用这个项目时,我们可能只用到其对mysql的支持,此时就可以在这个项目中配置可选依赖。

配置可选依赖的原因:1、节约磁盘、内存等空间;2、避免license许可问题;3、避免类路径问题,等等。

示例:

[html] view plain copy

  1. <project>
  2. ...
  3. <dependencies>
  4. <!-- declare the dependency to be set as optional -->
  5. <dependency>
  6. <groupId>sample.ProjectB</groupId>
  7. <artifactId>Project-B</artifactId>
  8. <version>1.0</version>
  9. <scope>compile</scope>
  10. <optional>true</optional> <!-- value will be true or false only -->
  11. </dependency>
  12. </dependencies>
  13. </project>

假设以上配置是项目A的配置,即:Project-A --> Project-B。在编译项目A时,是可以正常通过的。

如果有一个新的项目X依赖A,即:Project-X -> Project-A。此时项目X就不会依赖项目B了。如果项目X用到了涉及项目B的功能,那么就需要在pom.xml中重新配置对项目B的依赖。

二、依赖排除

当一个项目A依赖项目B,而项目B同时依赖项目C,如果项目A中因为各种原因不想引用项目C,在配置项目B的依赖时,可以排除对C的依赖。

示例(假设配置的是A的pom.xml,依赖关系为:A --> B; B --> C):

[html] view plain copy

  1. <project>
  2. ...
  3. <dependencies>
  4. <dependency>
  5. <groupId>sample.ProjectB</groupId>
  6. <artifactId>Project-B</artifactId>
  7. <version>1.0</version>
  8. <scope>compile</scope>
  9. <exclusions>
  10. <exclusion>  <!-- declare the exclusion here -->
  11. <groupId>sample.ProjectC</groupId>
  12. <artifactId>Project-C</artifactId>
  13. </exclusion>
  14. </exclusions>
  15. </dependency>
  16. </dependencies>
  17. </project>

当然,对于多重依赖,配置也很简单,参考如下示例:

[html] view plain copy

  1. Project-A
  2. -> Project-B
  3. -> Project-D
  4. -> Project-E <! -- This dependency should be excluded -->
  5. -> Project-F
  6. -> Project C

A对于E相当于有多重依赖,我们在排除对E的依赖时,只需要在配置B的依赖中进行即可:

[html] view plain copy

  1. <project>
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>sample.ProjectA</groupId>
  4. <artifactId>Project-A</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. <packaging>jar</packaging>
  7. ...
  8. <dependencies>
  9. <dependency>
  10. <groupId>sample.ProjectB</groupId>
  11. <artifactId>Project-B</artifactId>
  12. <version>1.0-SNAPSHOT</version>
  13. <exclusions>
  14. <exclusion>
  15. <groupId>sample.ProjectE</groupId> <!-- Exclude Project-E from Project-B -->
  16. <artifactId>Project-E</artifactId>
  17. </exclusion>
  18. </exclusions>
  19. </dependency>
  20. </dependencies>
  21. </project>

参考资料:

1、maven官网:http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

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

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

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

  2. MAVEN专题之三、坐标和依赖详解

    maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能.** 这是maven系列第3篇. 我们先来回顾一下什么是maven? maven是apache软件基金会组织维护的一款自动化构 ...

  3. Maven中的可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)

    1.Maven中依赖概述 Maven中的依赖关系是有传递性的.例如:项目B依赖项目C(B -> C),如果有一个项目A依赖项目B(A -> B)的话,那么项目A也会依赖项目C(A -> ...

  4. maven依赖optional可选依赖

    optional表示可选依赖,比如项目依赖了dubbo-spring-boot-starter <dependency><groupId>org.apache.dubbo< ...

  5. maven排除依赖包的子依赖_漫画谈一下Maven依赖

    Maven 依赖排除(Exclusions) 因为 Maven 构建的项目具有依赖可传递的特性,当你在 pom.xml添加某个依赖时,可能也会引入不需要的依赖到你的项目中,这将会会可能引起如下问题: ...

  6. Maven精选系列--依赖范围、传递、排除

    转载自 Maven精选系列--依赖范围.传递.排除 添加依赖 下面我添加了一个spring-web的依赖,maven就会去下载spring-web的jar包及它依赖的一些jar包. <depen ...

  7. npm、pnpm和yarn使用(官网、安装、命令行、上传自己的包、包版本号详解、更新卸载包、查看所有版本、同等依赖peer、可选依赖optional)

    目录 npm 官网 npm install packageName npm i packagename@版本号 安装git上发布的包 npm ci 注意(对比npm i) npm outdated n ...

  8. maven工程导入项目打开404_Maven依赖配置和依赖范围

    教程前面用坐标一一对应地描述了构件,并且保存在仓库中了.那用坐标描述好后,把它们放在仓库中的作用是什么呢?当其他项目需要在这些构件的基础上做开发的时候,用户就没必要自己再重新实现一遍了.直接指定坐标, ...

  9. Maven(1)--坐标与依赖

    坐标详解 Maven通过坐标唯一标识一个组件.Maven坐标是通过groupId.artifactId.version.packaging.classfier这些元素来定义的. <groupId ...

最新文章

  1. [转]使用批处理设置、启动和停止服务
  2. Windows下的Memcache安装
  3. 算法---字符串去重
  4. Vue.js 是什么
  5. OS- -I/O之I/O设备
  6. 网络名称 转换 网络地址_网络地址转换| 计算机网络
  7. 预处理器sass_Sass — Web的预处理器装饰
  8. ReportViewer教程(1)-新建工程,添加Form和报表浏览器
  9. centos 升级内核方法
  10. 付出与收获对等的自然法则,执行力离开去做马上去做
  11. OpenNI体感应用开发实战 (Kinect相机)
  12. Numpy的学习6-深浅赋值(copydeep copy)
  13. php中时间戳和正常日期的相互转化
  14. php 非常简单的导入sql文件
  15. Windows手动添加开机启动项
  16. java url 中文转码_URL请求中文、符号“乱码”(解码、转码)解决方式
  17. OSChina 周四乱弹 ——来我数数,你们中间有几只毛毛虫
  18. Microsoft Word2010 中设置和取消英文首字母大写
  19. 深信服AC路由部署模式,怎么启用为PN与总部机构为PN连接
  20. zabbix_agentd.exe [13816]: ERROR: cannot connect to Service Manager: [0x00000005]

热门文章

  1. Python中获取字典中最值对应的键
  2. net-ldap for ruby openNebula ldap
  3. ios 应用 开发流程。。。
  4. Cookie的小知识
  5. Mono 2.4 and MonoDevelop 2.0 have been released
  6. 【webrtc】webrtc的rtp重传代码分析
  7. 面试前必看:Redis 和 Memcached 的区别
  8. Ubuntu 16.04下Caffe-SSD的应用(四)——ssd_pascal.py源码解读
  9. 页游开发_小花仙即将出手游,敬童年一起玩过的7K7K和4399
  10. python绘制3d坐标轴_python – 尝试使用matplotlib更新3D图形坐标