漫画谈一下Maven依赖,百分之90的同学不知道!
扫描二维码
随时随地手机看文章
Maven 依赖排除(Exclusions)
因为 Maven 构建的项目具有依赖可传递的特性,当你在 pom.xml
添加某个依赖时,可能也会引入不需要的依赖到你的项目中,这将会会可能引起如下问题:
-
Jar
包版本冲突,如老版本Jar
包缺失某个方法; -
JDK 版本不兼容; -
老版本存在安全漏洞; -
...
为了解决这些问题,Maven 容许你通过 <exclusions>
来排除你不想要的依赖。这样,在你构建项目时,这些个排除依赖,将不会被打包进你的项目中。
PS:
<exclusions>
需要在具体的依赖上显示指定,针对特定的groupId
和artifactId
。
如何使用呢?
在 <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
的持久化框架,那你就得支持丰富的数据库吧,如:MySql
、 Oracle
不同版本、 PostgreSQL
等,这样才会有更多的用户使用你的框架。这样的话,你就不得不在你开发的持久化框架里引入种类繁多的数据库驱动包。
这个时候,某个用户使用了你的框架,而他用的是 MySQL
数据库,因为 Maven 构建项目具有依赖可传递的特性,导致了项目打包时,引入了很多不必要的数据库驱动,那压根不是他需要的~
当某个依赖的 <optional>
被定义为 true
后,该依赖便只能在本项目中传递,不会被传递到引用该依赖的父项目中,父项目需要主动引用才行。
为什么需要可选依赖项
可选依赖项可以帮助项目节省空间与内存,亦可防止将许可协议的依赖构建到 WAR
, EAR
, fat
jar 等包中。
如何使用
<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>
举个例子
针对上面的场景,可以在我们的持久化框架中,将每个驱动包依赖均设置为可选:
这时,假设有个 ProjectA 项目需要使用这个持久化框架,数据库使用的 Mysql
, 那么它还需要在 ProjectA 项目中,重新添加 Mysql
驱动依赖:
总结
最后,我们总结下 Maven 中的 <optional>
与 <exclusions>
的区别:
它们都是用来排除 Jar 包依赖的,但是作用上却是有所不同。
-
依赖被定义为 optional
可选,那么依赖只能在该项目中传递,并不会被传递到引用该项目的父项目中,父项目需要重新引用该依赖才可以。 -
exclusions
则是排除子项目中传递过来的依赖。
Ref
http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
长按订阅更多精彩▼
如有收获,点个在看,诚挚感谢
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!