7

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

 4 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzU4MDUyMDQyNQ%3D%3D&%3Bmid=2247485506&%3Bidx=1&%3Bsn=dd7c008275b6d4093949742ba5b54989&%3Bchksm=fd54d8c4ca2351d25e0b668f1a69829cef6f4d0768741d0239f412ec1e4b6b89e7762833bad9&%3Btoken=1348765997&%3Blang=zh_CN
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
UN77fae.png!webnUNb63z.png!webIBfIveb.png!webQZFzEr7.png!web2AzemiQ.png!web3aM7Jby.png!webBjEfMnr.png!webjeMjeur.png!web2aIvQry.png!webmQNnimQ.png!web

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>
ny2mqin.png!webmAJJzur.png!web

Maven 可选依赖 (Optional)

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

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

nuiEZnU.png!webfQRjium.png!web

当某个依赖的 <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:

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

yEBnIzN.png!web

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

uQ3iI3Y.png!weba2QRn2b.png!webQ7BFvqY.png!web

总结

最后,我们总结下 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: 笔者二维码,备注: 加群

bARzyuA.jpg!web

fiqqMnI.gif

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK