依赖项出现感叹号怎么办_SpringBoot中如何对依赖进行管理?

SpringBoot中的起步依赖(starter)是一组特定功能的依赖项集合,SpringBoot通过starter来进行项目的依赖管理,而不是直接基于单独的依赖项来进行依赖管理。

starter其实就是特殊的Maven依赖项或者Gradle依赖项,它把常用的库组合到一起构成了一个特定的功能。

举几个例子:spring-boot-starter-test是集成了测试功能的starter,spring-boot-starter-web是集成了web功能的starter,spring-boot-starter-data-mongodb是集成了MongoDB功能的starter。

starter中的依赖项都是经过官方精心测试的,能够保证相互之间的兼容性,最好不要进行更改。但是对于一些特定的场景、特定的需求来说也会遇到修改依赖项的时候,今天我们简单说一下如何进行修改。

测试目标:spring-boot-starter-web

我们项目里有2个starter,其中一个就是spring-boot-starter-web,我们就以它为目标进行依赖管理的测试。如图:

4da27600c6fc7528ec65b05f3e2427ae.png

spring-boot-starter-web

首先我们先通过以下maven命令查看一下spring-boot-starter-web有哪些依赖项。

mvn dependency:tree
6b1d928149154ff592aa5e987523a124.png

spring-boot-starter-web的依赖

从上图中我们可以看出我们项目依赖了spring-boot-starter-web,而spring-boot-starter-web又通过依赖传递依赖了jackson相关的jar包。我们接下来对jackson相关的包进行排除和替换,一起来看下需要什么操作。

排除依赖

如果我们需要把jackson相关的包移除掉该怎么办呢?很简单,直接在maven中通过标签就可以了,如图:

ed175c4b5d891564670ba7931b249d52.png

exclusions

然后再查看一下依赖,就发现spring-boot-starter-json下已经没有jackson相关的包了:

8c20a59eae4ac4034200308018c65782.png

排除jackson相关的包

maven的依赖管理原则

在对jackson相关的包进行替换之前,我们先看一下maven在处理依赖时的2个原则。

第一原则:路径最短者优先

比如说A对于C的依赖有2条路径,第一条路径为A->B->C(1.0),第二条路径为A->H->I->C(2.0),因为第一条路径的长度为2,第二条路径的长度为3,所以A采用路径最短的第一条路径下的C(1.0)。

第二原则:第一声明者优先

如果2条路径的长度都一样的话,那么此时第一声明者会被采用。

比如说A对于C的依赖有2条路径,第一条路径为A->B->C(1.0),第二条路径为A->H->C(2.0),此时第一条路径的长度和第二条路径的长度都是2,这个时候如果第一条路径先声明那么对于C的依赖就是1.0,如果是第二条路径先声明那么对于C的依赖就是2.0。

综上所述,大家应该能够发现,maven对于依赖项的管理和依赖项的版本没有关系。

替换依赖

替换依赖从字面上理解很简单,就是取代的意思,但是这里要讲清楚,替换包括高版本替换低版本和低版本替换高版本这两种。

根据maven的路径最短者优先的原则,如果我们想对jackson相关的包进行替换的话,我们直接在maven的pom文件中添加我们需要的特定版本的依赖项就可以了,而不用在意这个版本是更高的版本还是更低的版本,也不用再通过标签排除掉现有的版本,因为我们直接添加的依赖项路径更短。

下图是新添加的jackson相关的依赖,我们把改为更低的版本2.8.11:

33adc5e784d1c9cac8236d5a358899c5.png

2.8.11版本的jackson

66822d4262f1d61cc0fec3cba449a4cc.png

新增的jackson相关的依赖

我们再来查看一下依赖发现spring-boot-starter-json下已经没有的jackson相关的依赖,底部则直接添加了我们新配置的2.8.11版本的jackson相关的包。

c0a744ed42afad7329cdaaadd040889f.png

新增的jackson依赖

需要注意的是这是maven的配置,我们只需添加我们需要的特定版本的依赖项就可以了,而不用担心是更高版本的依赖还是更低版本的依赖,因为我们直接添加的依赖项相对于starter中的依赖项来说路径更短。

但是对于Gradle管理的项目来说并不是这么直接简单,Gradle对于依赖项会优先使用最新的版本。

如果你想用低版本的依赖项,除了需要添加这个低版本的依赖项之外还需要排除掉高版本的依赖项才可以。

结束

今天的内容到此就讲完了,我们讲述了springboot中如何排除特定的依赖,如何替换特性的依赖。另外还讲了maven对于依赖管理的2条原则。

希望这些能够帮助到大家,如果大家有什么疑问欢饮留言哦。

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

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

相关文章

5g理论速度_5G是什么?5G速度有多快?

原标题:5G是什么?5G速度有多快?5G到底是什么东西?今年5G网络会普及吗?5G网速到底有多快,背后又有哪些黑科技?近日,全球首个5G火车站在上海虹桥火车站启动建设。而根据三大运营商的时…

c++ new一个结构体_「C/C++」构造类型及应用:数组、结构体、共用体、枚举类型...

3.1数组同类型、同性质、按顺序存放的一组数据集合,易于批量处理。3.1.1一维数组定义int 1.数组名为常量,指向首地址,由系统指定。2.数组长度为整型常量,但不能为03.上例取值image[0]-image[255],取值可以修改。初始化int 输入for…

自动产生fsm代码的工具_代码自动生成工具

构建支持多种数据库类型的代码自动生成工具背景:一般的业务代码中写来写去,无外乎是先建好model,然后针对这个model做些CRUD的操作。(主要针对单表的业务操作)针对于数据库dao、mapper等的代码自动生成已经有了mybatisGenerator这种工具&…

gtest测试框架使用详解_测试框架TestNG使用介绍

近期接触到了一个比较全面的基于Java的接口自动化测试框架,作为一名Java小白,所以打算研究一下,顺带学习学习Java,该测试框架的逻辑控制层使用的HttpClient TestNG。在本期中,给大家分享一下TestNG测试框架的基础知识…

LOJ#6282. 数列分块入门 6

一个动态的插入过程,还需要带有查询操作。 我可以把区间先分块,然后每个块块用vector来维护它的插入和查询操作,但是如果我现在这个块里的vector太大了,我可能的操作会变的太大,所以这时候我需要把现在里面的数全部拿出…

fragment在activity中的静态和动态用法_使用Matlab修改压缩Gif动态图片制作微信表情...

脚本之家你与百万开发者在一起作者:theOwlAndPussyCat/焦旭光引言电脑里存了很多有意思的Gif动态图片,闲暇想把这些动图全导入微信表情,可是这些动图很多大小超过了微信表情大小1MB的限制,要制作成表情只能压缩图像文件大小。网上…

frontcon函数用不了_C++复制构造函数与析构函数

想用机器人赋能未来,少不了扎实的编程的基本功,让我们跟着清华大学的C语言程序设计课程一起过一遍C的语法知识吧!当定义基本类型的变量时,经常会用已有的变量去初始化新定义的变量,当定义对象的时候也有类似的需求&…

软件项目立项书_2019年度上海市软件和集成电路产业发展专项资金项目立项

上海艾瑞德生物科技有限公司荣获2019年上海市软件和集成电路产业发展专项资金(集成电路和电子信息制造领域)项目立项!上海艾瑞德生物科技有限公司的【医用体外诊断动态光场图像采集电子模块的研发及产业化】喜获2019年上海市软件和集成电路产业发展专项资金(集成电路…

mysql提供了表示日期和时间的数据类型_MySQL数据类型 - 日期和时间类型(1)

1.日期和时间数据类型语法用于表示时间值的日期和时间数据类型是DATE, TIME, DATETIME, TIMESTAMP和 YEAR。对于TIME, DATETIME和 TIMESTAMP值,MySQL支持小数秒,精度可达微秒(6位数)。要定义包含小数秒部分的列,请使用语法type_name(fsp)&…

软件质量保证计划_CMMI V2.0 精讲之“过程质量保证”

过程质量保证(PROCESS QUALITY ASSURANCE, PQA)目的:验证并改进已执行的过程和所产生的工作产品的质量。价值:增强过程使用和改进的一致性,以最大限度地提高业务效益和客户满意度。实践概述第1级PQA 1.1识别并解决过程和工作产品问题。第2级P…

mysql gzip_在mysql中存储GZIP:ed文本?

Is it a common thing for bigger applications and databases to GZIP text data before inserting it to the database?Ill guess that any full-text search on the actual text field will not be working before unzipping it again?解决方案Ive not seen this done muc…

html 分页_JQuery堪称完美的分页函数

演示效果&#xff1a;html部分&#xff08;引入jquery.js&#xff09;<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>jQuery简单的分页插件</title> </head><link rel"stylesheet" href"…

mysql 8.0.12解压版安装教程_mysql 8.0.12 解压版安装教程

本文为大家分享了mysql 8.0.12 解压版安装教程&#xff0c;供大家参考&#xff0c;具体内容如下1、首先在官网上下载mysql8.0.12的压缩包&#xff1a;下载地址2、下载成功后解压到任意目录&#xff0c;比如我的是E:\download\mysql-8.0.12-winx64&#xff1b;3、配置环境变量&a…

简洁又快速地处理集合——Java8 Stream(下)

上一篇文章我讲解 Stream 流的基本原理&#xff0c;以及它与集合的区别关系&#xff0c;讲了那么多抽象的&#xff0c;本篇文章我们开始实战&#xff0c;讲解流的各个方法以及各种操作 没有看过上篇文章的可以先点击进去学习一下 简洁又快速地处理集合——Java8 Stream&#xf…

python入口函数的作用_python之函数中参数的作用域

学编程究竟学的是什么呢&#xff1f;在写文章的这几天也一直在思考这个问题——恐怕这也是接下来的几年一直会去思考的问题。这个问题的答案也会指导我的方法论&#xff0c;所以索性整顿一下。 现阶段我的回答是&#xff0c;发现需求&#xff0c;然后解决。 最大的需求无非是完…

idea lombok 离线安装_Lombok与IntelliJ IDEA干了一架,完胜

我相信前段时间&#xff0c;有更新IDEA到2020.2版本的同学&#xff0c;在安装Lombok的过程中&#xff0c;肯定遇到与Lombok无法兼容的问题&#xff0c;并且报错&#xff1a;Caused by: com.intellij.psi.PsiInvalidElementAccessException: Element: class de.plushnikov.intel…

jquery设置宽_JavaScript学习笔记(三十二) jQuery(中)

jQuery昨天讲了 jQuery 的基本选择器筛选器和属性操作今天来说一些 jQuery 别的东西元素操作创建一个元素var div $()内部插入元素// 向 div 元素中插入一个 p 元素&#xff0c;放在最后$(div).append($())// 把 p 元素插入到 div 中去&#xff0c;放在最后$(hello).appendTo(…

python自动化框架测试实操_自动化框架之 python+selenium+pytest

1.概述 selenium&#xff1a; 基于JavaScript代码库的自动化测试框架&#xff0c;通过脚本语言&#xff0c;模拟用户行为操作&#xff0c;最接近用户真实场景&#xff0c;实现对web自动测试。 Selenium&#xff0c;是目前的最火爆企业最主流的webUI自动化框架 pytest: pytest是…

mysql 关联查询慢_mysql慢查询语句分析总结

我们经常会接触到MySQL&#xff0c;也经常会遇到一些MySQL的性能问题。我们可以借助慢查询日志和explain命令初步分析出SQL语句存在的性能问题通过SHOW FULL PROCESSLIST查看问题SHOW FULL PROCESSLIST相当于select * from information_schema.processlist可以列出正在运行的连…

python opencv3 轮廓检测

git&#xff1a;https://github.com/linyi0604/Computer-Vision 1 # coding:utf82 3 import cv24 import numpy as np5 6 # 创建一个200*200 的黑色空白图像7 img np.zeros((200, 200), dtypenp.uint8)8 # 在图像的中央位置 放置一个100*100的白色方块9 img[50:150, 50: 150] …