当前位置: 首页 > news >正文

Maven dependency中的scope

     Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中,scope的默认值是compile。

scope的分类

compile(默认)

含义: compile 是默认值,如果没有指定 scope 值,该元素的默认值为 compile。被依赖项目需要参与到当前项目的编译,测试,打包,运行等阶段。打包的时候通常会包含被依赖项目。

provided

       provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。

含义:被依赖项目理论上可以参与编译、测试、运行等阶段,相当于compile,但是再打包阶段做了exclude的动作。
适用场景:例如, 如果我们在开发一个web 应用,在编译时我们需要依赖 servlet-api.jar,但是在运行时我们不需要该 jar 包,因为这个 jar 包已由应用服务器提供,此时我们需要使用 provided 进行范围修饰。

runtime

runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。

含义:表示被依赖项目无需参与项目的编译,但是会参与到项目的测试和运行。与compile相比,被依赖项目无需参与项目的编译。
适用场景:例如,在编译的时候我们不需要 JDBC API 的 jar 包,而在运行的时候我们才需要 JDBC 驱动包。

test

含义: 表示被依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。
适用场景:例如,Junit 测试。

system

含义:system 元素与 provided 元素类似,但是被依赖项不会从 maven 仓库中查找,而是从本地系统中获取,systemPath 元素用于制定本地系统中 jar 文件的路径。例如:

<dependency><groupId>org.open</groupId><artifactId>open-core</artifactId><version>1.5</version><scope>system</scope><systemPath>${basedir}/WebContent/WEB-INF/lib/open-core.jar</systemPath>
</dependency>
import

它只使用在<dependencyManagement>中,表示从其它的pom中导入dependency的配置,例如 (B项目导入A项目中的包配置):

想必大家在做SpringBoot应用的时候,都会有如下代码:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version>
</parent>

继承一个父模块,然后再引入相应的依赖。
假如说,我不想继承,或者我想继承多个,怎么做?

我们知道Maven的继承和Java的继承一样,是无法实现多重继承的,如果10个、20个甚至更多模块继承自同一个模块,那么按照我们之前的做法,这个父模块的dependencyManagement会包含大量的依赖。如果你想把这些依赖分类以更清晰的管理,那就不可能了,import scope依赖能解决这个问题。你可以把dependencyManagement放到单独的专门用来管理依赖的pom中,然后在需要使用依赖的模块中通过import scope依赖,就可以引入dependencyManagement。例如可以写这样一个用于依赖管理的pom:

<project><modelVersion>4.0.0</modelVersion><groupId>com.test.sample</groupId><artifactId>base-parent1</artifactId><packaging>pom</packaging><version>1.0.0-SNAPSHOT</version><dependencyManagement><dependencies><dependency><groupId>junit</groupId><artifactid>junit</artifactId><version>4.8.2</version></dependency><dependency><groupId>log4j</groupId><artifactid>log4j</artifactId><version>1.2.16</version></dependency></dependencies></dependencyManagement>
</project>

然后我就可以通过非继承的方式来引入这段依赖管理配置

<dependencyManagement><dependencies><dependency><groupId>com.test.sample</groupId><artifactid>base-parent1</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependency><groupId>junit</groupId><artifactid>junit</artifactId>
</dependency>
<dependency><groupId>log4j</groupId><artifactid>log4j</artifactId>
</dependency>

注意:import scope只能用在<dependencyManagement>里面

这样,父模块的pom就会非常干净,由专门的packaging为pom来管理依赖,也契合的面向对象设计中的单一职责原则。此外,我们还能够创建多个这样的依赖管理pom,以更细化的方式管理依赖。这种做法与面向对象设计中使用组合而非继承也有点相似的味道。

那么,如何用这个方法来解决SpringBoot的那个继承问题呢?

配置如下:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.6.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

这样配置的话,自己的项目里面就不需要继承SpringBoot的module了,而可以继承自己项目的module了。

scope的依赖传递

       A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?

答案是:
      当C是test或者provided时,C直接被丢弃,A不依赖C;
      否则A依赖C,C的scope继承于B的scope。

下面是一张nexus画的图。

相关文章:

Maven dependency中的scope

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中&#xff0c;scope的默认值是compile。 scope的分类 compile&#xff08;默认&#xff09; 含义&#xff1a; compile 是默认值&#xff0c;如果没有指定 scope 值&#xff0c;该元素…...

代码随想录算法训练营DAY11 | 栈与队列 (2)

一、LeetCode 20 有效的括号 题目链接&#xff1a;20.有效的括号https://leetcode.cn/problems/valid-parentheses/ 思路&#xff1a;遇到左括号直接进栈&#xff1b;遇到右括号判断站顶是否有匹配的括号&#xff0c;没有就返回flase&#xff0c;有就将栈顶元素出栈&#xff1…...

【Spring实战】33 Spring Boot3 集成 Nacos 配置中心

文章目录 1. 配置中心定义2. 解决哪些问题3. 常用的配置中心4. 使用示例1&#xff09;没引入 Nacos 配置中心2&#xff09;引入依赖3&#xff09;配置Nacos连接信息4&#xff09;在 Nacos 上配置属性5&#xff09;在 Spring Boot 中使用配置6&#xff09;启动服务&验证7&am…...

ElementUI安装与使用指南

Element官网-安装指南 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 一、开发环境配置 电脑需要先安装好node.js和vue2或者vue3 安装Node.js Node.js 中文网 安装node.js命令&#xff1a;brew install node node.js安装完后&#xff0c;输入&#xff1…...

Opencv——图片卷积

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…...

项目安全-----加密算法实现

目录 对称加密算法 AES &#xff08;ECB模式&#xff09; AES(CBC 模式)。 非对称加密 对称加密算法 对称加密算法&#xff0c;是使用相同的密钥进行加密和解密。使用对称加密算法来加密双方的通信的话&#xff0c;双方需要先约定一个密钥&#xff0c;加密方才能加密&#…...

只用一台服务器部署上线(宝塔面板) 前后端+数据库

所需材料 工具&#xff1a;安装宝塔面板服务器至少一台、域名一个 前端&#xff1a;生成dist文件&#xff08;前端运行build命令&#xff09; 后端&#xff1a;生成jar包&#xff08;maven运行package命令&#xff09; 准备&#xff1a; 打开宝塔面板&#xff0c;点击进入软…...

《Pandas 简易速速上手小册》第8章:Pandas 高级数据分析技巧(2024 最新版)

文章目录 8.1 使用 apply 和 map 函数8.1.1 基础知识8.1.2 重点案例&#xff1a;客户数据清洗和转换8.1.3 拓展案例一&#xff1a;产品评分调整8.1.4 拓展案例二&#xff1a;地址格式化 8.2 性能优化技巧8.2.1 基础知识8.2.2 重点案例&#xff1a;大型销售数据分析8.2.3 拓展案…...

计算机网络_1.6.2 计算机网络体系结构分层的必要性

1.6.2 计算机网络体系结构分层的必要性 一、五层原理体系结构每层各自主要解决什么问题1、物理层2、数据链路层3、网络层4、运输层5、应用层 二、总结三、练习 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 本节主要介绍实现计算机网络需要解决哪些问题&#xff1f;以…...

跟着cherno手搓游戏引擎【18】抽象Shader、项目小修改

抽象&#xff1a; Shader.h: #pragma once #include <string>namespace YOTO {class Shader {public:virtual~Shader()default;virtual void Bind()const0;virtual void UnBind()const0;static Shader* Create(const std::string& vertexSrc, const std::string&am…...

每日OJ题_算法_模拟②_力扣495. 提莫攻击

目录 力扣495. 提莫攻击 解析代码 力扣495. 提莫攻击 495. 提莫攻击 难度 简单 在《英雄联盟》的世界中&#xff0c;有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希&#xff08;编者注&#xff1a;寒冰射手&#xff09;进入中毒状态。 当提莫攻击艾希&#xff0c…...

freertos 源码分析二 list链表源码

list.c 一、链表初始化 void vListInitialise( List_t * const pxList ) { pxList->pxIndex ( ListItem_t * ) &…...

Peter算法小课堂—Dijkstra最短路算法

大家好&#xff0c;我们人见人爱、花见花开、车见车爆胎的Peter Pan来啦&#xff0c;hia~hia~hia。今天&#xff0c;我们今天来学习毒瘤的最短路算法啦。啊这……什么是Dijkstra算法&#xff1f;长文警告⚠ 正经点啊 手算样例 大家思考一下&#xff0c;你在手算样例的时候&am…...

Python 读取和写入包含中文的csv、xlsx、json文件

背景 最近在做数据的训练&#xff0c;经常需要读取写入csv、xlsx、json文件来获取数据&#xff0c;在这里做简单总结记录。 ps: 读取和写入中文文件时&#xff0c;需要确保文件的编码格式是正确的。通常情况使用UTF-8编码格式。如果使用其他编码格式可能会导致读取或写入时出…...

【算法】利用递归dfs解决二叉树算法题(C++)

文章目录 1. 前言2. 算法题2331.计算布尔二叉树的值129.求根节点到叶节点数字之和LCR047.二叉树剪枝98.验证二叉搜索树230.二叉搜索树中第K小的元素257.二叉树的所有路径 1. 前言 有关 递归 的相关解释与解题 请看下文&#xff1a; 以汉诺塔理解递归、并用递归解决算法题 对于…...

计算机网络_1.6.1 常见的三种计算机网络体系结构

1.6.1 常见的三种计算机网络体系结构 1、OSI&#xff08;七层协议&#xff09;标准失败的原因2、TCP/IP参考模型3、三种网络体系结构对比 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 1、OSI&#xff08;七层协议&#xff09;标准失败的原因 &#xff08;1&#xf…...

XML传参方式

export function groupLoginAPI(xmlData) {return http.post(/tis/group/1.0/login, xmlData, {headers: {Content-Type: application/xml,X-Requested-With: AAServer/4.0,}}) }import {groupLoginAPI} from "../api/user"; function (e) { //xml格式传参let groupX…...

Pyecharts炫酷散点图构建指南【第50篇—python:炫酷散点图】

文章目录 Pyecharts炫酷散点图构建指南引言安装Pyecharts基础散点图自定义散点图样式渐变散点图动态散点图高级标注散点图多系列散点图3D散点图时间轴散点图笛卡尔坐标系下的极坐标系散点图 总结&#xff1a; Pyecharts炫酷散点图构建指南 引言 在数据可视化领域&#xff0c;…...

关于爬取所有哔哩哔哩、任意图片、所有音乐、的python脚本语言-Edge浏览器插件 全是干货!

这些都是现成的并且实时更新的&#xff01;从次解放双手&#xff01; 首先有自己的edge浏览器基本上都有并且找到插件选项 1.哔哩哔哩视频下载助手&#xff08;爬取哔哩哔哩视频&#xff09; bilibili哔哩哔哩视频下载助手 - Microsoft Edge Addons 下面是效果&#xff1a; 2.图…...

压力测试工具-Jmeter使用总结

目录 一.前言 二.线程组 三.线程组的组件 四.线程组-HTTP请求 1、JSON提取器 2、XPATH提取器 3、正则表达式提取器 五.线程组-断言 1、响应断言 2、JSON断言 六.创建测试 1.创建线程组 2.配置元件 3.构造HTTP请求 4.添加HTTP请求头 5.添加断言 6.添加查看结果树…...

(一篇入门)汽车电子电器之整车控制器VCU功能解析与测试实践

1. 整车控制器VCU&#xff1a;新能源汽车的"大脑" 第一次拆解新能源汽车时&#xff0c;我盯着那个巴掌大的金属盒子看了半天——这就是传说中的VCU&#xff08;整车控制器&#xff09;。它就像乐高套装里的核心积木&#xff0c;所有其他模块都得听它指挥。记得有次测…...

大模型实习复盘:GPT老师带你一个个接口硬啃

总结&#xff1a;互联网中厂大厂&#xff0c;尤其是给你权限给你机器玩的&#xff0c;去&#xff0c;提升极大。小公司or普通研究院&#xff0c;非常一般。一段实习&#xff0c;通常需要满足一些前置的技术条件才能拿到offer。但offer只是开始&#xff0c;还需要自己有意识地在…...

保姆级教程:用OpenCV+Wireshark搞定海康萤石摄像头RTSP视频流(附常见品牌地址格式)

从零破解&#xff1a;OpenCVWireshark实战解析主流安防摄像头RTSP协议 当你面对一台陌生的网络摄像头&#xff0c;既不知道IP地址也不清楚RTSP流格式时&#xff0c;那种无从下手的挫败感我深有体会。去年在帮朋友搭建智能监控系统时&#xff0c;我花了整整三天时间才搞明白不同…...

C++27异常处理增强配置(ISO/IEC 14882:2027草案第12.8节深度解密)

第一章&#xff1a;C27异常处理增强配置的标准化演进脉络C27标准委员会在异常处理机制上引入了关键性配置抽象&#xff0c;旨在统一跨编译器、跨平台的异常行为语义。核心演进方向聚焦于将异常传播策略、栈展开控制与诊断信息生成三者解耦&#xff0c;并通过标准化属性和编译期…...

生物信息学实战:如何用k-mer分析提升基因组测序质量(附Python代码示例)

生物信息学实战&#xff1a;k-mer分析在基因组测序质量提升中的关键作用 基因组测序数据的质量直接影响后续分析的可靠性&#xff0c;而k-mer分析技术正成为生物信息学工具箱中不可或缺的利器。想象一下&#xff0c;当你拿到一批新的测序数据时&#xff0c;如何快速识别其中的低…...

iSDIO库:嵌入式系统中FlashAir Wi-Fi卡的SDIO协议栈

1. iSDIO库概述&#xff1a;面向TOSHIBA FlashAir的嵌入式SDIO协议栈iSDIO&#xff08;intelligent SDIO&#xff09;库是一个专为东芝&#xff08;TOSHIBA&#xff09;FlashAir系列Wi-Fi SD卡设计的轻量级嵌入式驱动与通信中间件。该库并非通用SDIO主机控制器驱动&#xff0c;…...

Heltec ESP32 LoRaWAN协议栈深度解析与低功耗开发指南

1. 项目概述 ESP32_LoRaWAN 是 Heltec Automation 针对其 ESP32 LoRa 硬件平台深度定制的 LoRaWAN 协议栈实现&#xff0c;专为低功耗广域物联网&#xff08;LPWAN&#xff09;终端节点设计。该库并非通用型 LoRaWAN 封装&#xff0c;而是与 Heltec 自研硬件&#xff08;如 W…...

OpenClaw问题排查大全:百川2-13B-4bits量化模型接入常见错误

OpenClaw问题排查大全&#xff1a;百川2-13B-4bits量化模型接入常见错误 1. 问题排查前的准备工作 在开始排查OpenClaw与百川2-13B-4bits量化模型对接的问题前&#xff0c;我们需要先确认几个基础环境要素。这些准备工作往往能帮我们快速排除50%以上的低级错误。 首先检查Op…...

收藏必备!小白程序员必看:如何用AI智能体操作系统赋能医疗行业?

本文介绍了一项创新性研究&#xff0c;旨在解决大语言模型智能体在医疗场景中的应用难题。传统AI智能体在医疗领域存在权限过大、记忆碎片化、沟通机制单一和医院IT系统死板等问题。为解决这些痛点&#xff0c;研究团队提出了医疗版“AI操作系统”&#xff08;AOS-H&#xff09…...

计算机内存与缓存完全指南

计算机内存与缓存完全指南 目录 计算机存储体系概览内存&#xff08;RAM&#xff09;深度解析 2.1 RAM 的基本原理2.2 DRAM vs SRAM2.3 DDR 内存发展历史与对比2.4 内存关键参数详解2.5 内存模组类型&#xff08;DIMM / SO-DIMM / LPDDR&#xff09; CPU 缓存深度解析 3.1 缓…...