Maven 依赖排除(Exclusions)

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

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

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

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

如何使用呢?

<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等,这样才会有更多的用户使用你的框架。这样的话,你就不得不在你开发的持久化框架里引入种类繁多的数据库驱动包。

这个时候,某个用户使用了你的框架,而他仅需要使用数据库 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>

举个例子

漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?的更多相关文章

  1. 034 Maven中的dependencyManagement和dependencies区别

    这个标签使用过,但是具体的描述还是没有说明过.在这里,专门查了一下,写了这篇文章. 1.定义 在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管 ...

  2. Maven中dependencies和dependencyManagement的区别

    Maven项目中,为了保持引用依赖的一致性,一般会抽出一个parent层,用来管理子项目的maven依赖,对于依赖的管理有两种方式,分别是dependencies以及dependencyManagem ...

  3. Maven中plugins和pluginManagement的区别

    pluginManagement是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManagement声明可以被继承. pluginMa ...

  4. Maven中聚合与集成的区别

    如test-parent是一个聚合工程,打包方式为pom.xml test-a是test-parent的一个moudle模块,打包方式为jar,并且继承自test-parent: test-b是tes ...

  5. Maven 中 install,package,deploy命令区别

    mvn clean package依次执行了clean.resources.compile.testResources.testCompile.test.jar(打包)等7个命令. mvn clean ...

  6. maven中scope标签详解

    前言 最近在做itoo的pom优化工作,发现对于maven依赖管理中的scope标签还是有不明白的地方,所以今天就来总结一下这方面的知识,scope在maven的依赖管理中主要负责项目的部署 mave ...

  7. Maven中的pom.xml配置文件详解

    原文:http://blog.csdn.net/u012152619/article/details/51485297 <project xmlns="http://maven.apa ...

  8. 浅谈maven中的scope,systempath

    scope  maven中scope的默认值是compile scope的分类 1)compile 默认是compile.compile表示被依赖项目需要参与当前项目的编译,包括后续的测试,运行周期也 ...

  9. maven中profile的使用

    转载:https://blog.csdn.net/java_collect/article/details/83870215 前言       在开发过程中,我们的项目会存在不同的运行环境,比如开发环 ...

随机推荐

  1. Trie树-XOR-1695. Kanade的三重奏

    2020-03-18 21:58:18 问题描述: 给你一个数组A [1..n],你需要计算多少三元组(i,j,k)满足(i <j <k)和((A [i] xor A [j])<(A ...

  2. 动态规划-买卖股票的最佳时机 V

    2020-03-11 18:19:00 问题描述: 给出一个股票n天的价格,每天最多只能进行一次交易,可以选择买入一支股票或卖出一支股票或放弃交易,输出能够达到的最大利润值 样例 样例 1: 给出 ` ...

  3. Android通知栏前台服务

    一.前台服务的简单介绍 前台服务是那些被认为用户知道且在系统内存不足的时候不允许系统杀死的服务.前台服务必须给状态栏提供一个通知,它被放到正在运行(Ongoing)标题之下--这就意味着通知只有在这个 ...

  4. 一篇文章让你了解动态数组的数据结构的实现过程(Java 实现)

    目录 数组基础简单回顾 二次封装数组类设计 基本设计 向数组中添加元素 在数组中查询元素和修改元素 数组中的包含.搜索和删除元素 使用泛型使该类更加通用(能够存放 "任意" 数据类 ...

  5. OpenCV-Python 如何使用背景分离方法 | 四十六

    目标 背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术. 顾名思义,BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态 ...

  6. js Object方法小结

    1. Object.defineProperty(obj,prop,{                 value:...,                 writable:boolean,//可写 ...

  7. spring bean的装载过程简略赏析

    spring一个bean的容器,它从这个最基本的功能进而扩展出AOP,transaction,cache,schedule,data等等,将业务与框架代码解耦,让我们可以将大部分精力投入到业务代码中, ...

  8. Gold30Mins

  9. 移动自动化appium(2)- Allure报告使用详解

    6 Allure报告 6.1 Allure介绍 Allure是一个独立的报告插件,生成美观易读的报告,比之前的html好看,目前支持的语言:Java.PHP.Ruby.Python.C#等 6.2 A ...

  10. LeetCode(42.接雨水)多解法详解

    接雨水解法详解: 题目: 基本思路:从图上可以看出要想接住雨水,必须是凹字形的,也就是当前位置的左右两边必须存在高度大于它的地方,所以我们要想知道当前位置最多能存储多少水,只需找到左边最高处max_l ...