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


欢迎重视笔者的大众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!!

漫画:工作这么多年,你居然不知道 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 构建项目具有依靠可传递的特性,G N , ( t { . n当你在 pom.xml& d 1 r添加某个^ O E n 8 x依靠时,或许也会引进不需求的依靠到你的项目中,这将会会或k Z T S X 8 E许引起如下问题:

  • Jar包版本冲突,如老版本Jar包缺失某个方法;
  • JDK 版本不兼容;
  • 老版本存在安全漏洞% w H f p + 8 w ?
  • .} | h l k d C..

为了解决这些问w m 8 X Z m [题,Maven 容许你通过 <exclusions>来扫除你不想要的依靠。这样,在你构建项目时,这些被扫除依靠! + ,将不会被打包进你的项目中。

PS: <exclusions>需求在详细的依靠上显示指定,针对特定的 groupIdartifactId

怎么运用呢?

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

<project>
...
<dependencies>
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactu 8 w ^ YId>Project-A: x X x f</art7 s x _ C wifactId>
<version>1.0</version>
<sO ( | : = kcope>compile</scope>
<exclusions>
<exclusion>  <!-- 在这儿声明,将项目A中的项目B{ / / A K依靠扫除 -->
<groupId>sample.Projr G T a gectB</groupId>
<artifw U ) } x TactId>Project-B</artifactId>
</exclusion>
</exc4 & d U C 5lusions>
</N ] 7 M f D P Edependency>
</dependencies>
</project>
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

Maven 可选依靠H U I { (Optional)

Maven 的可选依靠其实$ 6 c p i很好理解,我举个比如,你就理解了!假定你想做一个类似 Mybatis的耐久化结构,那你就得支撑丰富的数据库吧,如:MySqlOracle不同版本、 PostgreSQL等,这样才会有更多的用户运用你的结构。这样的话,你就不得不在你开发 ~ u r % j F –的耐久化结构里引进品种繁多的数据库驱动包。

这个时s I x ! 7 n S ^ o候,某个用户运用了你的结构,而他仅需求运用数据库 MySQL,由于 Maven 构建项目具有依靠可传递的特性,导致了项目打包时,引进了许多不必要的数据库驱动,那压根不是他需求的~

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

当某个依靠的 <optional>被定义为 trueL B 9 P h v,该依靠便只能在本项目中传递,不会被传递到引证该依靠的父项目中,父项目需求主动引证才行。

为什么需求可选依靠项

可选依靠项能够协助项目节省空间与内存,亦可避免将答应协议的依靠构建到 Wo R T aAR, EAR, fatjar 等包中。

怎么运用

<project>
...
<dependencies>
<!-- 将 mysql 驱动包依靠设置为可选 -->
<dependency>
<groupId>mysql<8 ( [ q A !/groupId>
<artifactId>mysql-con^ 6 K [ d E :nector-java</artifa( - G [ VctId>
<version>5.1.45</ver! q _ w g g tsion>
<optional>true</optional> <!-- optional 的值有 true 和 falsj } J ( Ze 可选 -->
</dependency>
</depenT 1 H ~ e ` fdencies>
</proje0   # 0 ] / ! Tct>

举个比如

针对上面c g / [ 4 S 5 –的场景,能够在咱们的耐久化结构中,将每个驱动包依Z b `靠均设置为可选:

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

这时,假定有个 Pro * c # % . c =jectA 项目需求运用这个耐久化结构,% l Z x数据库运用的 Mysql, 那么它还需求在 ProjectA 项目中,从头添加 Mysql 驱动依靠:

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

总结

最后,咱们总结下 Maven 中x b x * C<optional>l + g 3 a<exclusiog v f } R ~ f b Uns>的差异:

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

  • 依靠被定义为 optional 可选,那么依靠只能在该项目中传递,并不会被传递到引证该项意图父项目中,父项* ? ~ # e 8 } d c目需求从头引证该依靠才能够。
  • exclusions 则是扫除子项目中传递过来的依靠。

PS: 这期共享到这儿就完毕咯,首次采用漫画文的这种创造方法,真的花了好长时间,希望小伙伴会喜欢这种方法~

能够的话,[ 0 H j ( /希望小伙伴们三连哟,阅读效果好的话,小哈会创造更多的漫画文,给技能添点料,让它稍微风趣一点z $ ( S O~

哈哈,下期见~

Ref

maven.apache.org/guides/intr…

www.exc + r Seption.site/essay/what-…

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

发表评论

提供最优质的资源集合

立即查看 了解详情