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

欢迎关注笔者的公众号: 小哈学Java, 专一于推送 Java 领域优质干货文章!!html

Maven 依赖排除(Exclusions)

由于 Maven 构建项目具备依赖可传递的特性,当你在 pom.xml添加某个依赖时,可能也会引入不须要的依赖到你的项目中,这将会会可能引发以下问题:java

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

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

PS: <exclusions>须要在具体的依赖上显示指定,针对特定的 groupIdartifactIdsql

如何使用呢?

<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)

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

这个时候,某个用户使用了你的框架,而他仅须要使用数据库 MySQL,由于 Maven 构建项目具备依赖可传递的特性,致使了项目打包时,引入了不少没必要要的数据库驱动,那压根不是他须要的~安全

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

为何须要可选依赖项

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

如何使用

<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>
复制代码

举个例子🌰

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

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

总结

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

它们都是用来排除 Jar 包依赖的,可是做用上倒是有所不一样。

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

PS: 这期分享到这里就结束咯,首次采用漫画文的这种创做方式,真的花了好长时间,但愿小伙伴会喜欢这种方式~

能够的话,但愿小伙伴们三连哟,阅读效果好的话,小哈会创做更多的漫画文,给技术添点料,让它稍微有趣一点~

哈哈,下期见~

Ref

maven.apache.org/guides/intr…

www.exception.site/essay/what-…

相关文章
相关标签/搜索