Maven 依赖排除(Exclusions)

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

  • Jar包版本冲突,如老版本Jar包缺失某个方法;

  • JDK 版本不兼容;

  • 老版本存在安全漏洞;

  • ...

为了解决这些问题,Maven 容许你通过 <exclusions>来排除你不想要的依赖。这样,在你构建项目时,这些个排除依赖,将不会被打包进你的项目中。

PS: <exclusions>需要在具体的依赖上显示指定,针对特定的 groupIdartifactId

如何使用呢?

<dependency>节点中添加<exclusions>,指定你想要排除的依赖,如下所示:

<project>...<dependencies><dependency><groupId>sample.ProjectA</groupId><artifactId>Project-A</artifactId><version>1.0</version><scope>compile</scope><exclusions><exclusion>  <!-- 在这里声明,将项目A中的项目B依赖排除 --><groupId>sample.ProjectB</groupId><artifactId>Project-B</artifactId></exclusion></exclusions> </dependency></dependencies>
</project>

Maven 可选依赖 (Optional)

Maven 的可选依赖其实很好理解,我举个例子,你就明白了!假设你想做一个类似 Mybatis的持久化框架,那你就得支持丰富的数据库吧,如:MySqlOracle不同版本、 PostgreSQL等,这样才会有更多的用户使用你的框架。这样的话,你就不得不在你开发的持久化框架里引入种类繁多的数据库驱动包。

这个时候,某个用户使用了你的框架,而他用的是 MySQL数据库,因为 Maven 构建项目具有依赖可传递的特性,导致了项目打包时,引入了很多不必要的数据库驱动,那压根不是他需要的~

当某个依赖的 <optional>被定义为 true后,该依赖便只能在本项目中传递,不会被传递到引用该依赖的父项目中,父项目需要主动引用才行。

为什么需要可选依赖项

可选依赖项可以帮助项目节省空间与内存,亦可防止将许可协议的依赖构建到 WAR, EAR, fatjar 等包中。

如何使用

<project>...<dependencies><!-- 将 mysql 驱动包依赖设置为可选 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.45</version><optional>true</optional> <!-- optional 的值有 true 和 false 可选 --></dependency></dependencies>
</project>

举个例子????

针对上面的场景,可以在我们的持久化框架中,将每个驱动包依赖均设置为可选:

这时,假设有个  ProjectA 项目需要使用这个持久化框架,数据库使用的 Mysql, 那么它还需要在 ProjectA 项目中,重新添加 Mysql 驱动依赖:

总结

最后,我们总结下 Maven 中的 <optional><exclusions>的区别:

它们都是用来排除 Jar 包依赖的,但是作用上却是有所不同。

  • 依赖被定义为 optional 可选,那么依赖只能在该项目中传递,并不会被传递到引用该项目的父项目中,父项目需要重新引用该依赖才可以。

  • exclusions 则是排除子项目中传递过来的依赖。

Ref

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

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

漫画谈一下Maven依赖,百分之90的同学不知道!相关推荐

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

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

  2. 阿里巴巴 连接池 druid 的使用、maven依赖

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.   Druid是一个JDBC组件,它包括三部分:  DruidDriver 代理Driver, ...

  3. 又出现依赖冲突?试试 IDEA 解决 Maven 依赖冲突的高能神器!

    以下文章来源方志朋的博客,回复"666"获面试宝典 1.何为依赖冲突 Maven是个很好用的依赖管理工具,但是再好的东西也不是完美的.Maven的依赖机制会导致Jar包的冲突.举个 ...

  4. 是时候装逼了,试试 IDEA 解决 Maven 依赖冲突的高能神器!

    点击关注公众号,Java干货及时送达 来源 | segmentfault.com/a/1190000017542396 1.何为依赖冲突 Maven是个很好用的依赖管理工具,但是再好的东西也不是完美的 ...

  5. 解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:桔子214032 segmentfault.com/ ...

  6. 解决 Maven 依赖冲突的好帮手,必须了解一下!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:桔子214032 sf.com/a/119000001754 ...

  7. 碰到Maven依赖冲突,想砸电脑?这个IDEA插件必须了解一下...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:https://urlify.cn/mAj6Nj # 何为依 ...

  8. [笔记]解决m2eclipse给项目添加maven依赖管理时可能不给项目的build path...

    为什么80%的码农都做不了架构师?>>>    解决办法:在m2eclipse提供的菜单里关闭项目的Maven依赖管理,然后再启动Maven的依赖管理!!! 检查:1)查看项目的.c ...

  9. 我爱Java系列---【 maven依赖版本冲突的解决方法】

    我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...

最新文章

  1. java中decimalFormat格式化数值
  2. 无数学不华为?人工智能时代的数学家还将走得更远
  3. crc生成多项式怎么算_利用system Verilog生成任意CRC多项式
  4. 【iCore组合式双核心开发板教程】通过STM32 FSMC 读写FPGA Verilog 例子
  5. 我是如何用 Redis 做实时订阅推送的?
  6. [系统安全] 六.逆向分析之条件语句和循环语句源码还原及流程控制
  7. linux 删除sysadm用户,linux 用户和组命令整理及详细介绍
  8. 2012.4.17总结(一)
  9. 农业物联网行业调研报告 - 市场现状分析与发展前景预测
  10. bzoj 3772: 精神污染 (主席树+dfs序)
  11. 我的微软亚洲研究院实习生面试经历
  12. 成语接龙和唐诗背诵文字游戏开发
  13. 国际期刊预警名单网址
  14. 蓝牙mesh-拓扑结构
  15. SpringCloud---熔断器Hystrix的作用--解决灾难性雪崩效应
  16. [转]跨越千年的RSA算法
  17. 什么是Subversion?
  18. mate30鸿蒙版,Mate30 5G版升级鸿蒙,初步谈论个人使用感受,以及还需待优化小bug
  19. vue百度地图实现路线规划(含途经点)
  20. 编译ijkplayer遇到的问题“/libavutil/arm/asm.S:50:9: error: unknown directive”的解决

热门文章

  1. linux网站权限怎么设置好,linux网站权限设置方法,网站安全配置,linux网站权限...
  2. 手写体数字识别+界面
  3. HDU1531(差分约束+Bellman_ford)
  4. PTA数据结构与算法题目集(中文)7-25
  5. [codeforces] 383C Propagating tree(dfs序+线段树)
  6. matlab入门学习2
  7. 2019 ICPC Asia Nanjing Regional J.Spy(KM算法O(n^3)板子题)
  8. H - Fibonacci POJ - 3070 (矩阵快速幂)
  9. cdh 安装_0623-6.2.0-如何在CDH中安装CFM
  10. python如何使用ppip安装xlwt_Python中xlrd和xlwt模块使用方法