一篇了解Maven中的<optional>和<scope>使用

目录

  • Maven的依赖传递
  • optional 与 scope 的区别
  • scope 的可选值

Maven的依赖传递

依赖管理是maven提供的主要功能之一,无论我们需要什么依赖,只需将它们添加到 POM.xml 中,在构建或运行时所有必要的类和资源都会自动添加到项目的 classpath 中。

Maven 中的依赖是有传递(Transitive)性的,默认会包含传递的依赖,这样就不用手动引用每一个依赖了。比如下面这个依赖关系中,A 依赖 B,B 依赖了 C……,如果你依赖 A 的话,就会自动包含 A/B/C/D/E

 A├── B│   └── C│       └── D └── E└── D 

但是传递依赖也带来了一个问题,比如下面这个例子:

  A├── B│   └── C│       └── D 2.0└── E└── D 1.0

由于传递依赖,D 2.0 和 D 1.0 都会被加入 ClassPath 中,但因为它们版本不同,很可能会有包冲突等一系列问题。解决这个依赖传递导致的冲突问题,有两种方案

方案一: 使用者,也就是发起依赖方进行排除

<dependency><groupId>group-a</groupId><artifactId>artifact-a</artifactId><version>1.0</version><exclusions><exclusion><groupId>group-c</groupId><artifactId>excluded-artifact</artifactId></exclusion></exclusions>
</dependency>

方案二: 提供方将依赖的范围定义为不传递,这样在构建时就不会包含这些不传递的依赖包了。不传递的配置有两种方式,也是本文讨论的重点

1): 定义 dependency scopeprovided

<dependency><groupId>group</groupId><artifactId>artifact-d</artifactId><version>2.0</version><!-- 不传递 --><scope>provided</scope>
</dependency>

2): 定义 <optional>true

<dependency><groupId>group</groupId><artifactId>artifact-d</artifactId><version>2.0</version><!-- 不传递 --><optional>true</optional>
</dependency>

在这两种不传递配置下,依赖关系都将在声明它们的模块的 classpath 中,但是使用将它们定义为依赖关系的模块不会在其他项目中传递它们,即不会形成依赖传递。

optional 与 scope 的区别

optional

可选的,可以理解为此依赖可选,如果不需要传递某项功能,可以不引用这个包。

scope provided

提供的,可以理解为此包不由我直接提供,需要调用者/容器提供

两者的使用场景介绍:

optional

现开发了一个类似Hibernate的框架,叫Summer吧,致敬下Spring,提供了多种数据库方言的支持:mysql/oracle/db2/postgresql…每种数据库支持也独立了一个module,Summer的依赖中配置了每种数据库的支持包:summer-mysql-support/summer-oracle-support…

但是实际引用此框架/依赖时,并不需要所有数据库方言的支持。此时可以把数据库的支持包都配置为可选的true。引用此框架时,只需按需引入自己需要的方言支持包即可,避免了冗余繁杂的依赖,也降低了jar包冲突的风险。

scope provided

现有一普通Web工程,必然会用到servlet-api这个包。但是实际上这个包一定是由容器提供的,因为我们这个web会部署到容器内,容器会提供servlet-api,如果此时项目中再引用的话就会造成重复引用,会有版本不一致的风险。

scope 的可选值

scope元素主要用来控制依赖的使用范围,指定当前包的依赖范围和依赖的传递性,也就是哪些依赖在哪些classpath中可用。常见的可选值有:compile, provided, runtime, test, system等。

compile(编译)

默认值。compile表示对应依赖会参与当前项目的编译测试运行等,是一个比较强的依赖。打包时通常会包含该依赖,部署时会打包到lib目录下。比如:spring-core这些核心的jar包。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

test(测试)

scope为test表示依赖项目仅参与测试环节,在编译、运行、打包时不会使用。最常见的使用就是单元测试类了。

类似单元测试这样的依赖,如果不设置scope为test,很显然它们会被打包、发布,但其实真是环境中并无什么作用。

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

runntime(运行时)

runntime仅仅适用于运行测试环节,在编译环境下不会被使用。比如编译时只需要JDBC API的jar,而只有运行时才需要JDBC驱动实现。

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version><scope>runtime</scope>
</dependency>

provided(已提供)

provide仅在编译测试阶段生效,provide不会被打包,也不具有传递性

比如:上面讲到的spring-boot-devtoolsservlet-api等,前者是因为不需要在生产中热部署,后者是因为容器已经提供,不需要重复引入。

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provided</scope>
</dependency>

system

system范围依赖与provided类似,不过依赖项不会从maven仓库获取,而需要从本地文件系统提供。使用时,一定要配合systemPath属性。不推荐使用,尽量从Maven库中引用依赖。

<dependency><groupId>sun.jdk</groupId><artifactId>tools</artifactId><version>1.5.0</version><scope>system</scope><systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自己开发一种编程语言,可以同时开发鸿蒙,Android ios的三个平台的应用

我想要开发一种可以在&#xff0c;鸿蒙操作系统&#xff0c;Android操作系统&#xff0c;和ios操作系统运行的&#xff0c;编程语言,意思是自己开发一种编程语言,可以同时开发鸿蒙,Android ios的三个平台的应用,请问怎么实现,需要哪些技术,flutter为什么可以开发Android,ios应用…

DVWA靶场中的xss-反射型xss、存储型xss的low、medium、high的详细通关方法

目录 1.DVWA反射型xss &#xff08;1&#xff09;Low&#xff1a; &#xff08;2&#xff09;Medium&#xff1a; &#xff08;3&#xff09;Heigh 2.xss存储型 &#xff08;1&#xff09;Low&#xff1a; &#xff08;2&#xff09;Medium &#xff08;3&#xff09;He…

实现 Spring Boot 项目热重载,无需重启,省时省力

实现 Spring Boot 项目热重载&#xff0c;无需重启&#xff0c;省时省力 插件介绍 通过 JRebel 插件 实现 Spring Boot 项目热重载。类似于前端 Webpack 热重载功能 无需重启&#xff0c;省时省力 安装插件 打开 IDEA 在插件中搜索&#xff1a;JRebel 安装成功后重启IDEA …

1.SQL - 概述

1. SQL语句分类 • 数据定义语言&#xff1a;简称DDL(Data Definition Language)&#xff0c;用来定义数据库对象&#xff1a;数据库&#xff0c;表&#xff0c;列等。关键字&#xff1a;create&#xff0c;alter&#xff0c;drop等 • 数据操作语言&#xff1a;简称DML(Data …

一起玩儿物联网人工智能小车(ESP32)——17. 用ESP32的ADC功能读取电源电压

摘要&#xff1a;本文主要介绍如何使用ESP32的ADC功能&#xff0c;读取物联网智能小车的电池电压 今天介绍一个ESP32的新功能——如何利用ESP32的引脚&#xff0c;采集模拟量信息。在前面GPIO的学习中我们知道&#xff0c;可以利用GPIO的引脚读取外部设备输出的高低电平信号&am…

什么是LangChain

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 LangChain 是一个旨在简化使用大型语言模型&#xff08;LLM&#xff09;创建应用程序的框架。它提供了许多功能&#xff0c;使与LLM的合作变得更加容易&#xff0c…

【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:学会使用mybatis框架

上一篇文章中&#xff0c;我们学习了通过JDBC与MySQL进行交互。如果我们平常在项目中使用mybatis框架作为我们的orm框架。这一次我们就来学习如何使用框架。我们项目中使用到maven。我们直接通过pom文件的方式给他引入进来。 MyBatis是一个简单而强大的持久层框架&#xff0c;…

SParC数据集介绍

导语 SParC是Text-to-SQL领域的一个多轮查询数据集。本篇博客将对该数据集论文和数据格式进行简要介绍。 SParC数据集概述 SParC是一个跨领域的多轮Text-to-SQL数据集。它包含有4298个问题轮次&#xff0c;大约有12k的自然语言问句到SQL标注的Question-SQL对。这些问题来自于…

多汗症是否会遗传?

多汗症确实具有一定的遗传倾向。 首先&#xff0c;多汗症在临床上是比较常见的疾病&#xff0c;并且给生活带来了很多困扰。其中&#xff0c;许多患者多汗症是有遗传倾向的&#xff0c;即这个病本身就有遗传的一个几率。尤其是病理性多汗症&#xff0c;遗传的可能性更大。 具…

JavaWeb的Servlet的入门和使用方法

1 什么是Servlet Servlet是Server Applet的简称&#xff0c;是用Java编写的是运行在 Web 服务器上的程序&#xff0c;它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet&#xff0c;可以收集来自网页表单的用户输…

提升FTP上传速度的方法(提升FTP下载速度的技巧)

在企业日常经营中&#xff0c;快速上传和下载文件至关重要。然而&#xff0c;在使用FTP&#xff08;文件传输协议&#xff09;进行文件传输时&#xff0c;速度可能成为瓶颈。为了提升工作效率&#xff0c;以下是一些建议&#xff0c;可以帮助企业提高FTP上传下载速度。 1、确保…

BERT的学习

BERT 1.前言 self-supervised learning是一种无监督学习的特殊形式&#xff0c;算法从数据本身生成标签或者目标&#xff0c;然后利用这些生成的目标来进行学习。&#xff08;也就是说数据集的标签是模型自动生成的&#xff0c;不是由人为提供的。&#xff09;例如&#xff0…

万能刷题小程序源码系统:功能强大+试题管理+题库分类+用户列表 附带完整的搭建教程

随着互联网技术的不断进步&#xff0c;线上学习已成为越来越多人的选择。刷题作为提高学习效果的重要方式&#xff0c;一直受到广大学生的喜爱。然而&#xff0c;市面上的刷题软件虽然繁多&#xff0c;但功能各异&#xff0c;质量参差不齐&#xff0c;使得很多用户在选择时感到…

偷流量、端口占用、网络负载高、socket创建释放异常等Android高阶TCP/IP网络问题定位思路

一&#xff0c;背景 通常一些偷流量、端口占用、网络负载高、socket创建释放异常等Android网络相关问题&#xff0c;可以通过使用tcpdump抓tcp/ip报文&#xff0c;来定位。但是tcpdump无进程信息&#xff0c;也没有APK包名信息&#xff0c;无法确认异常的报文来自哪些Apk或者n…

STM32F4系列单片机库函数模板工程创建

目录 一、工程配置 1、新建工程 2、芯片选择 3、工程子文件夹创建 &#xff08;1&#xff09;FWLIB文件夹添加文件 &#xff08;2&#xff09;CORE文件夹添加文件 &#xff08;3&#xff09;USER文件夹添加文件 4、工程设置 &#xff08;1&#xff09;工程中添加文件夹…

【前端技术】Vite vs Webpack

✨专栏介绍 在当今数字化时代&#xff0c;Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序&#xff0c;就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术&#xff0c;以及各种框架、库和工具…

Banana Pi BPI-M4 Berry 全志H618开发板快速使用手册

介绍 BPI-M4 Berry 开发板是一款功能强大的单板计算机 (SBC)&#xff0c;利用 Allwinner H618 片上系统 (SoC) 的功能为开发人员提供令人印象深刻的性能和丰富的功能。与 Raspberry Pi 4b 类似&#xff0c;BPI-M4 Berry 拥有可比的 CPU 性能、LPDDR4 内存支持、集成 WiFi 和蓝…

人机验证码生成与验证:提升系统安全性

一、前言 为了防止机器人或脚本程序自动化攻击和滥用系统资源&#xff0c;很多网站和应用程序需要使用验证码来判断用户是否为真人。 一般登录都要求用户手动输入以验证身份的安全措施。验证码是一种通过生成包含随机字符的图像或文本&#xff0c;通常包含了不同大小写字母、数…

内网穿透的应用-Ubuntu安装XRDP远程桌面结合内网穿透实现远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

HTML中的6种空格标记

HTML HTML中的6种空格标记 HTML提供了5种空格实体&#xff08;space entity&#xff09;&#xff0c;它们拥有不同的宽度&#xff0c;非断行空格&#xff08;&nbsp ;&#xff09;是常规空格的宽度&#xff0c;可运行于所有主流浏览器。其他几种空格&#xff08;&ensp…