漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
2020-04-22 15:17
337 查看
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,
fatjar 等包中。
如何使用
<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
则是排除子项目中传递过来的依赖。
PS: 这期分享到这里就结束咯,首次采用漫画文的这种创作方式,真的花了好长时间,希望小伙伴会喜欢这种方式~
可以的话,希望小伙伴们三连哟,阅读效果好的话,小哈会创作更多的漫画文,给技术添点料,让它稍微有趣一点~
哈哈,下期见~
Ref
http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
https://www.exception.site/essay/what-different-maven-optional-exclusions
相关文章推荐
- Maven Optional & Exclusions使用区别
- Maven Optional & Exclusions使用区别
- 如何打开JSP文件/JS和JSP的区别/Servlet的本质是什么,是如何工作的?
- Maven启动被终止---构建路径指定执行环境 J2SE-1.5。工作空间中没有与此环境严格兼容的JRE
- 数组,这个居然还不知道!
- maven install与maven build的区别
- maven项目导入eclipse 后需要做哪些工作?
- Linux 工作队列和等待队列的区别
- 关于数据结构和内存中堆和栈,你可能还不知道的几个区别
- 详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别
- Maven:mirror和repository 区别
- C++学了这么多年,你仍不知道的事!!!
- Maven中plugins和pluginManagement的区别
- maven的dependency之optional属性
- super与this的区别(不知道你就out了)
- IDEA中创建maven项目---工作记录
- 工作中JSP还没搞熟,下月居然有要有ASP的项目
- 程序员在互联网公司和行业软件公司工作,有什么区别?
- 你可能不知道的 Mac 技巧 - macOS 的窗口、标签与工作区
- Maven中<dependencies>节点和<dependencyManagement>节点的区别