Maven 中 scope=provided 和 optional=true 的区别

先说效果,maven依赖声明中加了<scope>provided</scope>,或者加了<optional>true</optional>,从效果上看是一样的,都会中断依赖传递,观察下图:

img

图中,项目B分别依赖了C和D,只不过一个声明了optional=true,一个声明了scope=provided,然后项目A再声明了B的依赖,此时在项目A环境中,既没有C,也没有D,所以在效果上看,它们是一样的。

那它们有哪些区别呢?

先看一下maven官方文档上对二者的描述:

  • optional:

If project Y depends on project Z, the owner of project Y can mark project Z as an optional dependency, using the “optional” element. When project X depends on project Y, X will depend only on Y and not on Y’s optional dependency Z. The owner of project X may then explicitly add a dependency on Z, at her option. (It may be helpful to think of optional dependencies as “excluded by default.”)

  • provided

This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime. For example, when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scope provided because the web container provides those classes. A dependency with this scope is added to the classpath used for compilation and test, but not the runtime classpath. It is not transitive.

大概意思是说,在A项目依赖B项目提供了一些特性,但又不想让这些特性默认提供,而是作为可以选择的附加功能,默认不提供,需要声明后(主动添加B项目的依赖)才生效,这时用optional;而对于provided,文档侧重提到了运行环境概念,强调只在编译时存在,而运行时不存在的依赖,也就是说,provided的主要用途不是为了考虑依赖是否传递,而是要看项目运行时是不是不应该有这个依赖(是不是需要jvm或者运行容器提供)。

经常拿scope=provided来举例的经典场景之一,就是servlet-api这个依赖了,在代码coding阶段需要使用到它的一些api,而在实际运行时,它的作用要由具体的运行容器来实现,因此编译时可以有它,而打成war包放到tomcat环境下运行时,war包里面不应该有这个servlet-api.jar,否则就会报错了。

在实际的spring-boot项目中,由于大部分使用了内置的undertow或者tomcat容器,已经不需要特别声明这个jar的provided属性了。事实上,日常中更经常需要被用到的,应该主要就是这个optinal了,比如你要提供一组基础jar包,供项目组中的其他同事在他们的项目中引入依赖使用时,如果你提供的某些依赖了其他jar包来做的功能并不一定会被使用到,便可以用到这个optinal了。特别是用到诸如@ConditionalOnClass这种检测项目中是否存在某个class的判断条件时,更是用optional的好时机。

provided的使用场景,除了servlet-apilombok也很适合:A项目使用lombok做了一些代码生成,完成开发需要deploy到私服仓库之前,记得要将lombok的依赖加上<scope>provided</scope>,因为它的作用周期已经在A项目打包完成时结束了,对于依赖A项目的其他项目,不需要用到lombok这个玩意儿,它们需要的是A项目提供的功能,而不是附带的帮助自己生成代码的额外功能;也不应该用optional,因为没什么好选择的,它并不是A项目提供的可选功能之一。


(END)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux标准IOday4

1:思维导图2: 创建2个子进程 父进程负责: 向文件中写入数据 2个子进程负责: 从文件中读取数据 要求: 一定保证1号子进程先读取&#xff0c;2号子进程后读取 使用文件IO去实现 #include <stdio.h>#include <string.h>#include <un…

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…

ColorGATE 23系列的RIP软件

ColorGATE 23系列的RIP软件。ColorGATE是全球领先的用于无化学胶片生产的RIP软件&#xff0c;以下是对其特点和功能的介绍&#xff1a; 应用领域 适用于柔版、胶版和丝网印刷等领域&#xff0c;利用喷墨打印机进行无化学胶片生产&#xff0c;可应用于高端品质的印刷。 核心技…

Type-C双屏显示器方案

在数字化时代&#xff0c;高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步&#xff0c;一款结合了便携性和高效视觉输出的设备——双屏便携屏&#xff0c;逐渐崭露头角&#xff0c;成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…

51单片机 DS18B20温度储传感器

DS18B20温度传感器 64-BITROM&#xff1a;作为器件地址&#xff0c;用于总线通信的寻址&#xff0c;是唯一的&#xff0c;不可更改 SCRATCHPAD&#xff08;暂存器&#xff09;&#xff1a;用于总线的数据交互 EEPROM&#xff1a;用于保存温度触发阈值和配置参数 暂存器 单总线…

对话新晋 Apache SeaTunnel Committer:张圣航的开源之路与技术洞察

近日&#xff0c;张圣航被推选为 Apache SeaTunnel 的 Committer成员。带着对技术的热情和社区的责任&#xff0c;他将如何跟随 Apache SeaTunnel 社区迈向新的高度&#xff1f;让我们一起来聆听他的故事。 自我介绍 请您简单介绍一下自己&#xff0c;包括职业背景、当前的工作…

Linux渗透实战之Hackademic: RTB1靶场提权

0x1 前言 一、浅谈 哈喽师傅们&#xff0c;这次又到了给师傅们分享文章的时候了&#xff0c;这篇文章呢主要是给师傅们以vulnhub中的Hackademic: RTB1靶场&#xff0c;开始使用nmap进行相关渗透测试的操作&#xff0c;端口、目录扫描&#xff0c;得到一个静态的html页面&…

SpringBoot-Day1

1.Springboot入门 创建Maven工程 导入spring-boot-stater-web起步依赖 编写Controller 提供启动类 2.yml配置信息书写与获取 书写 # 发件人信息 email:user: 172349823457qq.comcode: sajdajlwhjfgfkllwhost: smtp.qq.comauth: true ​ # 学生爱好 hobbies:- 打篮球- 踢…

基于扩频解扩+汉明编译码+交织的lora通信系统matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

针对服务器磁盘爆满,MySql数据库始终无法启动,怎么解决

&#xff08;点击即可进入聊天助手&#xff09; 很多站长在运营网站的过程当中都会遇到一个问题,就是网站突然无法打开,数据一直无法启动 无论是强制重启还是,删除网站内的所有应用,数据库一直无法启动 这个时候,就需要常见的运维手段了,需要对服务器后台各个资源,进行逐一排查…

LeetCode1170 比较字符串最小字母出现频次

字符串算法探秘&#xff1a;最小字母频次统计与比较问题剖析 在编程的世界里&#xff0c;字符串处理问题犹如繁星般繁多且各具特色。今天&#xff0c;我们聚焦于一道饶有趣味的题目&#xff0c;它涉及到对字符串中最小字母出现频次的统计以及基于此的比较操作。这道题不仅考验…

Kafka 分区管理

分区是主题的子集&#xff0c;每个主题可以被分割成多个分区&#xff0c;一个分区有一个主副本&#xff08;Leader&#xff09;及一个或多个从&#xff08;Follower&#xff09;副本。分区允许将数据分布在多个broker上&#xff0c;这样可以提高数据的处理能力、并行性及可靠性…

xcrun: error: invalid active developer path 解决

在拉取 github 代码时&#xff0c;提示如下报错&#xff1a; xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 原因是&#xff1a;这是由于 Xcode command line t…

2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…

Python 二次元初音未来桌宠

标题 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#xff0c;点个关注不迷路&…

vue3学习日记5 - 项目起步

最近发现职场前端用的框架大多为vue&#xff0c;所以最近也跟着黑马程序员vue3的课程进行学习&#xff0c;以下是我的学习记录 视频网址&#xff1a; Day2-11.项目起步-静态资源引入和ErrorLen安装_哔哩哔哩_bilibili 学习日记&#xff1a; vue3学习日记1 - 环境搭建-CSDN博…

【Linux系统】—— vim 的使用

【Linux系统】—— vim 的使用 1 vim 的基本概念2 vim 的多模式3 命令模式下的命令集3.1 进入/退出其他模式3.2 光标移动命令集3.3 复制/剪切/粘贴/删除命令集3.4 撤销命令集3.5 查找命令集3.6 替换命令集3.7 进入与退出替换模式 4 批量化编译5 底行模式6 vim 小技巧7 vim简单配…

JAVA实战开源项目:课程智能组卷系统(Vue+SpringBoot) 附源码

本文项目编号 T 009 &#xff0c;文末自助获取源码 \color{red}{T009&#xff0c;文末自助获取源码} T009&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 老…

了解 Ansys Mechanical 中的网格方法:综合指南

网格是每个有限元分析 &#xff08;FEA&#xff09; 仿真的支柱。它将几何图形划分为离散单元&#xff0c;使 Ansys Mechanical 能够近似模型在各种条件下的行为。结构良好的网格可确保准确、可靠和计算高效的结果&#xff0c;而结构不佳的网格可能会导致错误、收敛问题或不必要…

【Linux】深刻理解软硬链接

一.软硬链接操作 1.软连接 touch 创建一个文件file.txt &#xff0c;对该文件创建对应的软链接改怎么做呢&#xff1f; ln -s file.txt file-soft.link .给对应文件创建软连接。 软连接本质就是一个独立的文件&#xff0c;因为我们对应的软连接有独立的inode&#xff0c;他…