漫画:你居然不知道 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 中 Optional 和 Exclusions 的区别?


Maven 依赖排除(Exclusions)

因为 Maven 构建项目具有依赖可传递的特性,当你在 pom.xml添加某个依赖时,可能也会引入不需要的依赖到你的项目中,这将会会可能引起如下问题:

  • Jar包版本冲突,如老版本Jar包缺失某个方法;
  • JDK 版本不兼容;
  • 老版本存在安全漏洞;
  • ...

为了解决这些问题,Maven 容许你通过 <exclusions>来排除你不想要的依赖。这样,在你构建项目时,这些被排除依赖,将不会被打包进你的项目中。/<exclusions>

PS: <exclusions>需要在具体的依赖上显示指定,针对特定的 groupId和artifactId。/<exclusions>

如何使用呢?

在 <dependency>节点中添加<exclusions>,指定你想要排除的依赖,如下所示:/<exclusions>/<dependency>

<code><project>
...
<dependencies>

<dependency>
<groupid>sample.ProjectA/<groupid>
<artifactid>Project-A/<artifactid>
<version>1.0/<version>
<scope>compile/<scope>
<exclusions>
<exclusion>
<groupid>sample.ProjectB/<groupid>
<artifactid>Project-B/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>
/<dependencies>
/<project>
复制代码/<code>


漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?


漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?


Maven 可选依赖 (Optional)

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

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


漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?


漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?


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

为什么需要可选依赖项

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

如何使用

<code><project>
...
<dependencies>

<dependency>
\t\t\t<groupid>mysql/<groupid>
\t\t\t<artifactid>mysql-connector-java/<artifactid>
\t\t\t<version>5.1.45/<version>
<optional>true/<optional>
\t\t/<dependency>
/<dependencies>
/<project>
复制代码/<code>

举个例子

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


漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?


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


漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?


漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?


漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?


总结

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

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

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


作者:犬小哈
链接:https://juejin.im/post/5e9ff0916fb9a03c2f4e2581


分享到:


相關文章: