用了那么久的Maven,我们都知道Maven的依赖关系具有传递性,比如A依赖B,B依赖C,那么A也依赖于C,具体在项目中的表现见图:

上述依赖在pom.xml中的关系是这样的:

C(cc-spring-boot-starter-autoconfigure):<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency>B(cc-spring-boot-starter):<dependency><groupId>cc.lu</groupId><artifactId>cc-spring-boot-starter-autoconfigure</artifactId></dependency>A(cc-starter-demo):
<dependency><groupId>cc.lu</groupId><artifactId>cc-spring-boot-starter</artifactId>
</dependency>

但是在实际的应用中,项目A可能不是必须依赖C,如果不做处理的话,最终会让项目A非常的臃肿,打的包非常大。在Maven中,提供了两种方式管理非必须的依赖关系:可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusion)。

一、依赖排除(exclusion)

在项目A中,不需要依赖项目C中的org.springframework.boot:spring-boot-configuration-processor包,但是项目B仍然需要依赖它,也就是说我们需要在项目A中将这个包排除掉,但是又不能影响其他项目对这个包的依赖,关系图为:

我们只要在需要排除的项目A中,对依赖的dependency加上exclusion并指定要排除包的groupId和artifactId即可,不需要指定版本号,若上有项目依赖了多个相同包的不同版本,在这里会全部都排除掉。对应的pom.xml文件内容:

C(cc-spring-boot-starter-autoconfigure):<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency>B(cc-spring-boot-starter):<dependency><groupId>cc.lu</groupId><artifactId>cc-spring-boot-starter-autoconfigure</artifactId></dependency>A(cc-starter-demo):
<dependency><groupId>cc.lu</groupId><artifactId>cc-spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></exclusion></exclusions>
</dependency>

二、可选依赖(optional)

可选依赖就厉害了,只允许在当前项目使用,从不往下传递,下游项目要是想使用的话需要自己重新引入,比如org.springframework.boot:spring-boot-configuration-processor是自动生成配置参数的功能性包,也仅仅就在生成参数声明的时候用到,没必要往下传递,那么这种就需要在项目C中做控制了,严禁它依赖的包向下传递。

我们在项目C中将org.springframework.boot:spring-boot-configuration-processor的optional选项设置为true,默认为false(true: 不向下传递,false: 向下传递),在org.mybatis:mybatis包中有大量的应用,可以自行查看一下,这里放张图:

项目pom.xml内容如下,关注一下项目C的:

C(cc-spring-boot-starter-autoconfigure):<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>B(cc-spring-boot-starter):<dependency><groupId>cc.lu</groupId><artifactId>cc-spring-boot-starter-autoconfigure</artifactId></dependency>A(cc-starter-demo):
<dependency><groupId>cc.lu</groupId><artifactId>cc-spring-boot-starter</artifactId>
</dependency>

总结

在Maven依赖管理中,有依赖排除和可选依赖两种方式可以屏蔽项目不需要的包,区别是只想在当前项目使用的话就用可选依赖,若在当前项目不想使用依赖的包中的某个包,则用依赖排除。

  1. 可选依赖是在第一级被引用的地方使用optional标签声明
  2. 依赖排除是在具体不需要依赖的那一级(也可以理解为最后一级)使用exclusion控制

Maven中optional和exclusion的区别相关推荐

  1. maven 打包数据库加密_漫画:工作这么多年,你居然不知道 Maven中 Optional 和 Exclusions 的区别?...

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

  2. Maven中option与exclusion的区别

    Optional Dependencies 当无法(无论出于何种原因)将项目拆分为子模块时,将使用option依赖项. 我们的想法是,某些依赖项仅用于项目中的某些功能,如果不使用该功能则不需要. 理想 ...

  3. Maven中optional和scope元素的使用,你弄明白了?

    在梳理项目的过程中发现很多开发同学对Maven依赖文件的配置并不了解,特别是对Maven的optional元素和scope元素的使用也非常随意.这就会导致发布的jar包或war包非常"胖&q ...

  4. Maven中dependencies与dependencyManagement的区别

    之前在一个开源项目代码中看到有人在maven的依赖中使用 dependencyManagement,由于对这个不是很了解,忽然发现网上有个大神已经写了一个比较好的博客,因此这里直接转载(https:/ ...

  5. maven 中 dependencies 与 dependencyManagement 的区别

    前言 当前的团队工程项目是一个 maven 工程,里面有多模块,包含了父 pom 与子 pom.而在父 pom 中,我见到了 dependencyManagement 这个东西.我们知道一个 mave ...

  6. maven中plugins和pluginmanagement的区别

    stackoverflow中讲的不错 http://stackoverflow.com/questions/10483180/maven-what-is-pluginmanagement plugin ...

  7. Maven 中 plugins 和 pluginManagement的区别

    plugins 下的 plugin 是真实使用的,而 pluginManagement 下的 plugins 下的 plugin 则仅仅是一种声明,父项目是不能使用的,子项目中可以对 pluginMa ...

  8. maven 中 pom.xml 配置文件标签说明,dependencyManagement和dependencies区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 参考:http://zhaoshijie.iteye.com/blog/2094478 http:/ ...

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

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

最新文章

  1. 人民日报三问人工智能,给法律制度带来哪些挑战?
  2. pb数据窗口显示图片_PowerPhotos帮助你再Mac系统上更好,更快的管理自己的图片...
  3. 更改SYS密码,expiry_date 过期时间 没有更新,普通用户更改密码会更新
  4. c++面向对象高级编程 学习一 不带指针的类
  5. http请求502_从知乎页面的502说一说测试人员应该知道的HTTP协议状态码!
  6. Android 自定义组合控件小结
  7. 如何把netterm的内容输出到文件_python pandas如何输出csv文件
  8. 用word模仿手写字体
  9. 服务器远程关机软件,实现远程关机需要哪些步骤?向日葵怎么实现远程关机控制?...
  10. JAVA输出希腊字母表
  11. java redis scan6_Redis中scan命令的深入讲解
  12. Mac OX 下方便的微信语音,图片,视频等导出方式
  13. latex-符号和长度
  14. vue yaml代码编辑器组件
  15. 20191009 3. 史上最全的USB-PD充电协议,包含PD协议波形图
  16. Java进阶(四)多态
  17. Symbian开发FAQ(转)
  18. Python实现自动登录“实习云平台”网站
  19. excelhome 知识树
  20. 008.西门子M440变频器USS通信

热门文章

  1. android 高仿糯米界面,iOS (UIButton封装)仿糯米首页缩放“按钮”效果
  2. dcl学习_dcl简介
  3. C# 加密算法RC4
  4. python获取实时股票价格,python股票价格实时数据馈送(脚本调试)
  5. plupload分片上传php,plupload 大文件分片上传与PHP分片合并探索
  6. 《淘宝网开店 SEO 推广 营销 爆款 实战200招》——1.7 网店推广的误区
  7. html的页面怎样直接跨域访问,【HTML】iframe跨域访问问题
  8. 我们的福报和命运中隐藏的秘密
  9. linux部署tomcat,linux tomcat部署war包
  10. 用matlab实现非线性曲线拟合