漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
欢迎重视笔者的大众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!!










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>
需求在详细的依靠上显示指定,针对特定的groupId
和artifactId
。
怎么运用呢?
在 <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 可选依靠H U I { (Optional)
Maven 的可选依靠其实$ 6 c p i很好理解,我举个比如,你就理解了!假定你想做一个类似 Mybatis
的耐久化结构,那你就得支撑丰富的数据库吧,如:MySql
、 Oracle
不同版本、 PostgreSQL
等,这样才会有更多的用户运用你的结构。这样的话,你就不得不在你开发 ~ u r % j F –的耐久化结构里引进品种繁多的数据库驱动包。
这个时s I x ! 7 n S ^ o候,某个用户运用了你的结构,而他仅需求运用数据库 MySQL
,由于 Maven 构建项目具有依靠可传递的特性,导致了项目打包时,引进了许多不必要的数据库驱动,那压根不是他需求的~


当某个依靠的 <optional>
被定义为 true
后L B 9 P h v,该依靠便只能在本项目中传递,不会被传递到引证该依靠的父项目中,父项目需求主动引证才行。
为什么需求可选依靠项
可选依靠项能够协助项目节省空间与内存,亦可避免将答应协议的依靠构建到 Wo R T aAR
, EAR
, fat
jar 等包中。
怎么运用
<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 `靠均设置为可选:

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



总结
最后,咱们总结下 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-…
