maven mysql驱动_漫画:你居然不知道 Maven 中 Optional 和 Exclusions 的区别?

944e16064f0757eb12aa9ca2d1027359.png
8c0eeb8394d424816e7081bb7002860f.png
90c2c6f73993df5c015a9ab5a82588ef.png
fba0a31b274f6592a52302749658a37b.png
4f511dc268de646070a0ca17ae0df7aa.png
b7c179fd052527b22b66ace1b2890813.png
6c576842f458bf61dd3718a4bb7a5d0c.png
f575881bbce804e9fefe43c9bdfb47cd.png
39b588977cc332c1a679563ab3c13467.png
3b9bf528f0fa52a42411db0ca3c31fbe.png

Maven 依赖排除(Exclusions)

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

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

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

PS: 需要在具体的依赖上显示指定,针对特定的 groupIdartifactId

如何使用呢?

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

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectAgroupId>
      <artifactId>Project-AartifactId>
      <version>1.0version>
      <scope>compilescope>
      <exclusions>
        <exclusion>  
          <groupId>sample.ProjectBgroupId>
          <artifactId>Project-BartifactId>
        exclusion>
      exclusions> 
    dependency>
  dependencies>
project>
6ade2324ae7bc7c25484336d7905b05e.png
b2310378139093012e39c12ba371ba42.png

Maven 可选依赖 (Optional)

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

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

7c603e05cc08c37acff76a8e9c614409.png
eff1c364340a3b93a5f72dd0df0ab243.png

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

为什么需要可选依赖项

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

如何使用

<project>
  ...
  <dependencies>
    
    <dependency>
   <groupId>mysqlgroupId>
   <artifactId>mysql-connector-javaartifactId>
   <version>5.1.45version>
      <optional>trueoptional> 
  dependency>
  dependencies>
project>

举个例子?

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

6a68cbaf7d3238ce3f47dcc81ca61bdb.png

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

1b5d4fc4e025e91f4735a829763044e5.png
ec3482cb78a22a0081c23a9ae3ce6d6c.png
0d72fbd064b5ea5fe7e8b13a843053ac.png

总结

最后,我们总结下 Maven 中的  与 的区别:

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

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

最后,小伙伴们三连伺候一下吧(跪求),效果好的话,小哈会创作更多的漫画文,给技术添点料,让枯燥的技术变的有趣一点~

Ref

http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

8f2f35b875c0a406a6be84100a4152ce.gif    ●为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中? ●一招就让 switch 性能提升 3 倍 ●如何优雅地停止 Spring Boot 应用?

35fed9d8a80e121a17e9ddd452ee0104.png

觉得不错,点个在看~

7970d71ed4cb7bda393a00f88dc1c2e4.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值