漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

栏目: IT技术 · 发布时间: 5年前

内容简介:因为 Maven 构建的项目具有依赖可传递的特性,当你在为了解决这些问题,Maven 容许你通过PS:
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

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 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

Maven 可选依赖 (Optional)

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

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

漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

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

为什么需要可选依赖项

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

如何使用

<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>

举个例子:chestnut:

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

漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

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

漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

总结

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

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

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

PS: 这期分享到这里就结束咯,首次采用漫画文的这种创作方式,真的花了好长时间:sob:,光是小哈原型的确定,就出了n个版本,希望小伙伴会喜欢这种方式~

最后, 小伙伴们三连伺候一下吧(跪求) ,效果好的话,小哈会创作更多的漫画文,给技术添点料,让枯燥的技术变的有趣一点~

Ref

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

PS: 另外,小哈建了个学习交流群,禁广告、推广,群内氛围非常不错的,大家有啥问题也可以在群里提问,有需要的小伙伴可以加一下~

加群方式 - 扫描下方 :point_down: 笔者二维码,备注: 加群

漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

活着就为改变世界

活着就为改变世界

[美] 杰弗里·扬、威廉·西蒙 / 蒋永军 / 中信出版社 / 2010-6 / 39.00元

内容简介 苹果公司CEO史蒂夫•乔布斯这个一直活在自己想象的世界里的创业奇才,经历过各种挫折与失落,但他那无所畏惧、敢于承担的个性让他一直努力实践着自己的价值观,总能为他的离奇想法找到解决问题的办法。 本书两位作者通过深入访谈和资料调查,揭秘了许多乔布斯个人的创业经历和家庭变故,为大家塑造了一个活生生的“乔布斯式”的鲜活人物,描述了一个个充满传奇色彩的商业奇迹,真实地再现了乔布斯几十年......一起来看看 《活着就为改变世界》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具