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

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

内容简介:因为 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 的区别?

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

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


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

查看所有标签

猜你喜欢:

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

Clean Architecture

Clean Architecture

Robert C. Martin / Prentice Hall / 2017-9-20 / USD 34.99

Practical Software Architecture Solutions from the Legendary Robert C. Martin (“Uncle Bob”) By applying universal rules of software architecture, you can dramatically improve developer producti......一起来看看 《Clean Architecture》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试