Maven中的依赖管理
目录
什么是依赖范围
什么是依赖传递
依赖范围对依赖传递的影响
依赖冲突
什么是依赖冲突
依赖冲突的解决方案
版本锁定
短路径优先
编辑
声明优先
特殊优先(后来者居上)
可选依赖
排除依赖
可选依赖和排除依赖的区别
刷新依赖的8种方式
资源文件的指定
在Java开发中,项目的依赖管理是一项重要任务。通过合理管理项目的依赖关系,我们可以有效的管理第三方库,模块的引用及版本控制。而Maven作为一个强大的构建工具和依赖管理工具,为我们提供了便捷的方式来管理项目的依赖。
什么是依赖范围
Maven的依赖构件包含一个依赖范围的属性。这个属性描述的是三套classpath的控制,即编译、测试、运行。这说白了就是添加的jar包起作用的范围。 maven提供了以下几种依赖范围:compile,test,provided.runtime,system。
分别介绍如下:
- compile:编译依赖范围,如果没有指定,默认使用该依赖范围,对于编译、测试、运行3种classpath都有效。
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.24</version><scope>compile</scope></dependency> </dependencies>
- test:测试依赖范围,使用此依赖范围的maven依赖,只对编译测试、运行测试的classpath有效,在编译主代码、运行项目时无法使用此类依赖。比如junit,它只有在编译测试代码及运行测试的时候才需要。
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency> </dependencies>
- provided:已提供依赖范围。表示项目的运行环境中已经提供了所需要的构件,对于此依赖范围的maven依赖,对于编译源码、编译测试、运行测试中classpath有效,但在运行时无效。比如上面说到的servlet-api,这个在编译和测试的时候需要用到,但是在运行的时候,web容器已经提供了,就不需要maven帮忙引入了。
<dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency> </dependencies>
- runtime:运行时依赖范围,使用此依赖范围的maven依赖,对于测试和运行项目的classpath有效,但在编译时无效,比如jdbc驱动实现,项目代码编译的时候只需要提供JDK提供的JDBC接口,运行的时候才需要具体的jdbc驱动实现。
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version><scope>runtime</scope></dependency> </dependencies>
- system:系统依赖范围,该依赖与3中classpath的关系,和provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素显示第指定依赖文件的路径。这种依赖直接依赖于本地路径中的构件,可能每个开发者机器中构件的路径不一致,所以如果使用这种写法,你的机器中可能没有问题,别人的机器中就会有问题,所以建议谨慎使用。
<dependencies><dependency><groupId>com.bjpowernode</groupId><artifactId>maven_001_javase</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>D:/repository/com/bjpowernode/maven_001_javase/1.0-SNAPSHOT/maven_001_javase-1.0-SNAPSHOT.jar</systemPath></dependency> </dependencies>
总结:
什么是依赖传递
依赖具有传递性。 Maven 的依赖传递机制是指:不管 Maven 项目存在多少间接依赖,POM 中都只需要定义其直接依赖,不必定义任何间接依赖,这在一定程序上简化 了POM 的配置。
假项目A依赖项目B,项目B依赖项目C,则A----->直接依赖B,B----->直接依赖C,A----->间接依赖C。
直接依赖和间接依赖是一个相对的概念。直接在项目中配置的依赖称为直接依赖,通过添加依赖关联进来的依赖称为间接依赖。1是项目的直接依赖,2是1的直接依赖,2是项目的间接依赖,以此类推。
如图:
依赖范围对依赖传递的影响
B 是 A 的直接依赖,C 是 A 的间接依赖,根据 Maven 的依赖传递机制,间接依赖 C 会以传递性依赖的形式引入到 A 中,但这种引入并不是无条件的,它会受到依赖范围的影响。
图示依赖传递关系:
规范化依赖传递的结果:
交叉部分的单元格的取值为传递性依赖的依赖范围,若交叉单元格取值为 “-”,则表示该传递性依赖不能被传递。
通过上表,可以总结出以下规律:
- 当间接依赖的范围是compile时,与直接依赖的范围一致;
- 当间接依赖的范围是test或provided时,传递性依赖不会被传递;
- 当间接依赖的范围是runtime时,传递性依赖的范围与直接依赖的范围一致,此时传递性依赖的范围为runtime。
依赖冲突
什么是依赖冲突
在 Maven 项目中,依赖通常被定义在项目的 pom.xml 文件中。当多个依赖项引入了不同版本的相同库时,就会发生依赖冲突。这可能是因为项目的直接依赖和间接依赖导致了同一库的多个版本存在于类路径中。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,从而造成类包冲突。
依赖冲突的解决方案
Maven可以通过以下途径解决依赖冲突。
版本锁定
在父工程中使用dependencyManagement 进行版本锁定,dependencyManagement可以统一管理整个项目的版本号,确保应用的各个项目的依赖和版本一致。 dependencyManagement只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖,便可以忽略版本号。如果排斥父工程中定义的版本号,可以显示的进行版本号声明。
- 子工程使用父工程锁定的版本号
- 子工程使用自定义的版本号,只要重新声明即可
- 父工程不使用<dependencyManagement>标签,则子工程跟父工程完全保持一致。子工程不需要显示依赖任何jar包。
短路径优先
引入路径短者优先,顾名思义,当一个间接依赖存在多条引入路径时,引入路径短的会被解析使用。如图 :
声明优先
如果存在短路径,则优先选择短路径,如果路径相同的情况下,先声明者优先,POM 文件中依赖声明的顺序决定了间接依赖会不会被解析使用,顺序靠前的优先使用。如图。
代码示例:
注意去掉<scope>标签,否则会因为依赖范围的影响导致效果无法显示。
特殊优先(后来者居上)
同一个pom.xml文件中进行了多次依赖jar包不同版本的配置,后面的覆盖前面的配置。这种情况比较少见。
可选依赖
maven_03项目可选择是否传递间接依赖junit_4.13,主动权在当前项目maven_03中。如果当前项目被依赖到其它项目中,当前项目可以拒绝交出间接依赖项。例如maven_02添加了maven_03的依赖,maven_03可以自主设置其依赖项junit_4.13是否被间接传递。<optional>true</optional> 为不传递间接依赖,那么在maven_02项目中就没有junit_4.13的依赖。默认是false,是传递间接依赖。
代码示例:
排除依赖
是当前项目是否主动断开其依赖项目的间接依赖。也就是控制当前项目是否使用其直接依赖传递下来的接间依赖。在maven_02项目中添加maven_03项目的依赖,但不要maven_03项目中的junit_4.13的依赖,可以选择排除依赖。这样可以保证当前项目依赖的纯净性。
排除依赖使用 exclusions 元素排除依赖,说明如下:
- exclusions 元素下可以包含若干个 exclusion 子元素,用于排除若干个间接依赖,该元素包含两个子元素:groupId 和 artifactId,用来确定需要排除的间接依赖的坐标信息
- exclusion 元素中只需要设置 groupId 和 artifactId 就可以确定需要排除的依赖,无需指定版本version
如图:
代码示例:
可选依赖和排除依赖的区别
排除依赖和可选依赖都能在项目中将间接依赖排除在外,但两者实现机制却完全不一样。
- 可选依赖是自己决定是否向外提供间接依赖(maven_03设置拒绝提供间接依赖junit)
- 排除依赖是主动拒绝添加直接依赖关联的间接依赖(maven_02项目设置排除maven_03的junit依赖)
- 可选依赖的优先级高于排除依赖
- 若对于同一个间接依赖同时使用排除依赖和可选依赖进行设置,那么可选依赖的取值必须为 false,否则排除依赖无法生效。
刷新依赖的8种方式
在idea中有时候会出现刷新延时的情况,那么需要进行手工刷新依赖。
- 点击M刷新按钮。
- 点Maven窗口的Reload All Maven Projects。
- Build--->ReBuild Project 重新构建项目的同时刷新所有依赖。
- 点击本项目的pom.xml文件--->右键--->Maven--->Reload Project 刷新本项目的依赖。
- 打开pom.xml文件,全选,拷贝,删除,关闭,打开,粘贴.物理刷新pom.xml文件 。
- Invalidate Caches--->全选--->Invalidate and Restart 清空idea的缓存并重启idea刷新依赖。
- 打开本地仓库,搜索last,全选删除,点Maven的刷新全部依赖的按钮。
- 在7的步骤后执行File--->settings--->Build,Execution,Deployment--->Build Tools--->Maven--->Repositories--->选中本地仓库--->update--->ok。
资源文件的指定
src/main/java 和 src/test/java 这两个目录中的所有*.java 文件会分别在 comile 和 test-comiple 阶段被编译,编译结果分别放到了 target/classes 和 targe/test-classes 目录中,但是这两个目录中的其他文件(后缀是.properties或.xml等文件)都会被忽略掉(编译后丢失),如果需要把 src 目录下的除.java之外的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。以下内容放到<build>标签中。简单来说就是在resources目录下的*.properties文件和*.xml文件编译时不丢失,但resources目录外的*.properties文件和*.xml文件会丢失,所以要指定位置,保证编译后文件都在.
代码示例:
添加指定后:
指定代码:
<build><resources><resource><!--指定java目录下的所有路径下的所有文件--><directory>src/main/java</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes></resource><resource><!--指定resources目录下的所有路径下的所有文件--><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes></resource></resources>
</build>
相关文章:
Maven中的依赖管理
目录 什么是依赖范围 什么是依赖传递 依赖范围对依赖传递的影响 依赖冲突 什么是依赖冲突 依赖冲突的解决方案 版本锁定 短路径优先 编辑 声明优先 特殊优先(后来者居上) 可选依赖 排除依赖 可选依赖和排除依赖的区别 刷新依赖的8种方式…...
生态修复项目管理软件
在“双碳”目标与生态文明建设的双重驱动下,生态修复项目正成为全球环境治理的核心战场。然而,矿山复绿、湿地修复、水土保持等工程往往面临跨地域、多主体、长周期的管理难题——从数据分散到进度失控,从成本超支到风险频发,传统…...
深度剖析 RocketMQ 5.0 之架构解析:云原生架构如何支撑多元化场景?
拓展学习:🔍「RocketMQ 中文社区」 持续更新,提供 RocketMQ 领域专家模型的 AI 答疑 作者 | 隆基 简介: 了解 RocketMQ 5.0 的核心概念和架构概览;然后我们会从集群角度出发,从宏观视角学习 RocketMQ 的管…...
Spring中bean的生命周期(笔记)
bean的生命周期,按照最重要五步 第一步:实例化bean,调用无参构造方法(通过BeanDefinition利用反射实例化Bean对象(无参数构造方法) 并通过推断构造方法...并放入三级缓存中..) 第二步:给bean属性赋值(调用…...
transform-实现Encoder 编码器模块
Encoder 论文地址 https://arxiv.org/pdf/1706.03762 Encoder结构介绍 Transformer Encoder是Transformer模型的核心组件,负责对输入序列进行特征提取和语义编码。通过堆叠多层结构相同的编码层(Encoder Layer),每层包含自注意力机…...
LVGL -窗口操作
1 窗口背景介绍 在 LVGL 中,screen 是一个顶层对象,代表你设备上当前显示的整个画面。它相当于一个“全屏容器”,你可以在上面添加按钮、标签、图像、容器等各种界面控件。它的本质就是一个特殊的 lv_obj_t,但它没有父对象&#…...
ollama运行qwen3
环境 windows server GPU 32G 内存 40G 升级ollama 需要版本 0.6.6以上 ollama --version拉取模型 ollama pull qwen3:32b时间比较长,耐心等待 运行模型 ollama run qwen3:32b运行起来之后发现GPU是可以跑起来的,发个你好看看 默认是深度思考的,不…...
如何查看和验证AWS CloudFront的托管区域ID
在使用AWS Route 53设置DNS记录时,正确识别CloudFront分发的托管区域ID是至关重要的。本文将详细介绍几种查看和验证CloudFront托管区域ID的方法,特别关注中国区CloudFront的特殊情况。 为什么托管区域ID很重要? 托管区域ID是AWS服务中的一个关键标识符。在创建指向CloudF…...
yum 安装 ncurses-devel 报错 baseurl 的解决方法
解决 yum 安装 ncurses-devel 报错(baseurl 问题) 出现 yum install ncurses-devel 报错 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 的原因,很可能是因为 CentOS 7 的 SCL 源在 2024 年 6 月 30 日停止维护了。以下是解…...
《Vue3学习手记7》
组件通信(续) $attrs 组件通信:$attrs 适用于祖传孙或孙传祖 (需要通过中间组件) 传递给后代的数据,但未被接收,都保存在attrs中 1.祖传孙 父组件: <template><div cl…...
算法备案类型解析:如何判断你的算法属于哪种类型?
根据《互联网信息服务算法推荐管理规定》政策,算法备案已经成为了强制性备案。但对于企业而言,如何准确判断自身算法所属的备案类型往往存在困惑,今天我们就来详细盘一盘算法备案的类型,教你如何判断自己的算法属于哪一类 一、算…...
Javascript 中作用域的理解?
一、作用域的类型 1. 全局作用域(公司大门外) 范围:整个 JavaScript 文件变量:像贴在公告栏上的信息,所有人可见例子:const companyName "阿里"; // 全局变量,任何地方都能访问 fu…...
Qt入门——什么是Qt?
Qt背景介绍 什么是Qt? Qt 是⼀个 跨平台的 C 图形用户界面应用程序框架 。它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是 完全面向对象 的,很容易扩展。Qt 为开发者提供了 ⼀种基于组件的开发模式 ,开发者可以通过简单的拖拽和组合…...
Snap7西门子PLC通信协议
S7协议,作为西门子的专有协议,广泛应用于多种通讯服务中,如PG通讯、OP通讯以及S7基本通讯等。它独立于西门子的各种通讯总线,能够在MP、PROFIBUS、Ethernet以及PROFINET等多种网络上运行。S7协议实质上是一个由多种应用层协议构成…...
GTC Taipei 2025 医疗域前瞻:从AI代理到医疗生态,解码医疗健康与生命科学的未来图景
引言 2025年,全球医疗健康领域正经历一场由人工智能、机器人技术与分布式计算驱动的范式转移。随着NVIDIA及其生态伙伴在GTC Taipei 2025大会上的深度布局,医疗行业的核心趋势愈发清晰:AI代理程序(Digital AI Agents)赋能临床协作、医疗大数据与精准医学加速落地、医学影…...
C++的vector中emplace_back() 与 push_back() 的区别
C 中 vector 的 emplace_back() 和 push_back() 均用于向容器末尾添加元素,但二者在实现和效率上有显著区别: 1. 参数传递方式 push_back():接受一个已构造的对象(左值或右值),将其拷贝或移动到容器中。 s…...
LangChain4j +DeepSeek大模型应用开发——5 持久化聊天记忆 Persistence
默认情况下,聊天记忆存储在内存中。如果需要持久化存储,可以实现一个自定义的聊天记忆存储类,以便将聊天消息存储在你选择的任何持久化存储介质中。 1. 存储介质的选择 大模型中聊天记忆的存储选择哪种数据库,需要综合考虑数据特…...
C++核心编程 1.2 程序运行后
1.2 程序运行后 栈区: 由编译器自动分配释放, 存放函数的参数值,局部变量等 注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放 int * func() {int a 10;return &a; }int main() {int *p func();cout << *p <…...
小市值策略复现(A股选股框架回测系统)
相关config配置 https://quantkt.com/forumDetail?id201043 很早就知道了小市值模型,正好量化选股回测框架出来了,把最裸的小市值复现下,顺便验证下框架逻辑。 科普: 小市值策略基于 “小市值效应”,即从历史数据来看…...
C语言(6)—函数递归
文章目录 一、递归的基本概念1.1 什么是递归1.2 递归的核心思想1.3 递归的必要条件 二、递归的经典应用2.1 阶乘计算 三、递归与迭代的比较3.1 递归的优缺点3.2 迭代的优缺点 四、递归的底层机制4.1 函数调用栈4.2 栈溢出风险 五、递归优化技巧5.1 记忆化(Memoizati…...
【网络】HTTP报文首部字段
目录 一. 预备知识 1.1.代理、网关和隧道 1.1.1.代理 1.1.2.网关 1.1.3.隧道 1.2.保存资源的缓存 1.2.1.缓存的有效期限 1.2.2.客户端的缓存 1.3.用单台虚拟主机实现多个域名 二. HTTP首部字段 2.1.HTTP 首部字段格式 2.2.四种 HTTP 首部字段类型 三. HTTP通用首部…...
【Fifty Project - D20】
今日完成记录 TimePlan完成情况7:30 - 11:30收拾行李闪现广州 & 《挪威的森林》√10:00 - 11:00Leetcode√16:00 - 17:00健身√ Leetcode 每日一题 每日一题来到了滑动窗口系列,今天是越…...
【Linux系统】systemV共享内存
system V共享内存 在Linux系统中,共享内存是一种高效的进程间通信(IPC)机制,它允许两个或者多个进程共享同一块物理内存区域,这些进程可以将这块区域映射到自己的虚拟地址空间中。 共享内存区是最快的IPC形式。一旦这…...
【计算机网络】DHCP——动态配置ip地址
DHCP 是什么? DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是一种网络协议,用于自动分配 IP 地址和其他网络配置参数(如子网掩码、默认网关、DNS 服务器等)给网络中的设备&…...
TDengine 订阅不到数据问题排查
简介 TDengine 在实际生产应用中,经常会遇到订阅程序订阅不到数据的问题,总结大部分都为使用不当或状态不正确等问题,需手工解决。 查看服务端状态 通过 sql 命令查看有问题的 topic 和consumer_group 组订阅是否正常。 select * from inf…...
低版的spring boot 1.X接入knife4j
低版的spring boot 1.X接入knife4j 老的项目是用spring boot 1.5.10.RELEASE 不好升级 ,原来接口文档一直用的是老的swagger样式,不是很好看,网上查了下,发现有个knife4j挺好看的,用一下他们的样式,下面是…...
outlook for mac本地邮件存放在哪儿?
尽管 PST 格式通常与 Microsoft Outlook 联系在一起,但认为它也在 Mac OS 上存储邮箱数据是一种误解。实际上,Outlook for Mac 不会将邮件存储为 PST 文件。无法在 Outlook for Mac 中找到 PST 文件位置,因为它不使用 PST 文件来存储邮箱数据…...
javascript<——>进阶
一、作用域:变量可以被访问的范围 1.局部作用域 1.1函数作用域 在函数内部声明的变量,在函数内部被访问的,外部无法直接访问。 总结:1、函数内部声明的变量,在函数外部无法直接访问 2、函数的参数也是函数内部的局…...
Java练习8
一.题目 二.源码 package TestRuMen;import java.util.Random; import java.util.Scanner;public class Test11 {public static void main(String[] args){// 调用 createNumber 方法生成一组随机的中奖号码int[] arrcreateNumber();// 调用 userInputNumber 方法获取用户输入…...
C语言按位操作符
在C语言中,按位操作符直接对整数的二进制位(bit)进行操作,常用于底层编程、硬件控制或性能优化场景。以下是按位操作符的详细说明和用法: 1. 按位操作符列表 操作符名称功能描述示例&按位与对应位均为1时结果为1&…...
Linux(权限管理)
权限概述 基本概念 定义:Linux权限是操作系统对用户和进程访问资源进行精细化管控,通过读(r4)、写(w2)、执行(x1)三种基础权限组合实现。 其中在运维的角度看它们所对应的操作权限…...
Redis入门到实战——基础篇
一、初识Redis 1. 认识NoSQL 2. 认识Redis Redis诞生于2009年,全称Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL数据库。 特征: 键值型(key-value),value支持多种…...
ctf.show 卷王杯 pwn签到
pwn签到 64位 ret2libc pwn签到 (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file pwn pwn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]0953abcf1dd6…...
Dali 1.1.4 | 使用尖端技术将描述转换成独特艺术品、照片和图像,发挥无限创意
Dali是一款先进的AI图像生成器应用程序,能够根据用户的描述生成不同风格的独特图像。无论是迷人的数字艺术、创新的纹身设计还是独一无二的标志,甚至是超写实的照片,Dali都能轻松应对。这款解锁版为用户提供了更多的创作自由度和无限可能&…...
LeetCode 2906 统计最大元素出现至少K次的子数组(滑动窗口)
给出一个示例: 输入:nums [1,3,2,3,3], k 2 输出:6 解释:包含元素 3 至少 2 次的子数组为:[1,3,2,3]、[1,3,2,3,3]、[3,2,3]、[3,2,3,3]、[2,3,3] 和 [3,3] 。该题也是一个比较简单的滑动窗口的题目,但是…...
文献阅读(三)基于干旱强度和恢复时间的生态系统恢复力评估|《Agricultural and Forest Meteorology》
傅伯杰院士团队发表在《Agricultural and Forest Meteorology》上的一篇文章,定义了一个新的恢复力指标,通过指数拟合曲线表征干旱强度和相应恢复时间的关系,用曲线面积量化恢复力;耦合干旱强度和恢复时间来评估生态系统对干旱的恢…...
32、Server.Transfer和Response.Redirect的区别是什么?
Server.Transfer 和 Response.Redirect 是 ASP.NET 中用于页面跳转的两种方法,但它们在实现机制、性能、URL 显示等方面存在显著区别。以下是两者的核心差异: 1. 实现机制 Server.Transfer 服务器端跳转:直接在服务器内部将请求从当前页面…...
iOS—仿tableView自定义闹钟列表
自定义View实现闹钟列表,左滑删除,滑动列表时收起删除按钮。用代理的方法实现ListView的创建,删除以及开关回调,并实现动画效果。 ClockViewCell使用block通知ListView,ListView通过代理通知上层ClockView 1、文件组…...
Spark,集群搭建-Standalone
集群搭建-Standalone 一、解压 在之前的学习中我们有了一个软件包 spark.3.1.2-bin-hadoop3.2.tgz (eg我的在 /opt/software目录下)把这个软件包解压到 /opt/module 下(也可以自己决定解压到哪里)。对应的命令是: t…...
【C++11】新的类功能、lambda
📝前言: 这篇文章我们来讲讲C11——新的类功能、lambda、包装器 🎬个人简介:努力学习ing 📋个人专栏:C学习笔记 🎀CSDN主页 愚润求学 🌄其他专栏:C语言入门基础…...
stm32 g031g8 flash擦除函数被坑
先记录一下在擦除的时候由于调用了这个FLASH_PageErase(FLASH_BANK_1, secpos); 导致擦除不成功,写入失败。 下面的擦除有问题// 使用 FLASH_PageErase 擦除该页while ((FLASH->SR & FLASH_SR_BSY1) ! 0); // 等待空闲FLASH_PageErase(FLASH_BANK_1, secpo…...
SQL实战:04之SQL中的分组问题求解
文章目录 概述题目:分组问题求解题解第一步:求解差值步骤二:窗口分组累加完整SQL 总结 概述 最近刷题时遇到一些比较有意思的题目,乍一遇上时还不知道怎么求解,在灵光一闪时找到了问题的求解答案,感觉还比…...
基于DrissionPage的实习信息爬虫改造与解析
目录 编辑 一、DrissionPage技术优势分析 二、代码改造实现 2.1 环境配置 2.2 爬虫类定义 2.3 核心爬取逻辑 一级页面解析优化 二级页面解析优化 2.4 分页控制机制 三、关键技术解析 3.1 智能元素定位 3.2 请求管理优化 3.3 反爬对抗策略 四、改造前后对比测试…...
react-native打包报错:缺少build文件夹
在React Native项目中,如果你遇到了提示“没有build文件夹”的问题,这通常是因为项目的某些部分没有正确初始化或者配置。以下是一些解决步骤。如果缺少build文件,这会导致你使用gradlew assembleRealease失败,进而无法打包APK。下…...
【无需安装额外软件,JavaScript脚本】B站批量取消关注
步骤 注意: 提前选好需要批量取消关注的分组!!!脚本过程中会提示要求输入B站账号的手机号码作为验证,不是封号,只是验证!!! 打开B站关注页面 进入个人关注网页࿰…...
【Linux】第十五章 调度未来任务
1.如何调度延迟的用户任务? at 软件包包含 atd守护进程,和一组命令(at、atq等)。在默认的 RHEL 安装过程中,将自动安装并启用 atd守护进程。root 及普通用户可以使用 at 命令创建计划任务,atd守护进程提供…...
JVM GC垃圾回收算法
垃圾回收算法(GC Algorithms) JVM 根据对象生命周期特性(分代假设)采用不同的回收算法,核心算法包括: 标记-清除(Mark-Sweep) 此算法执行分两阶段。第一阶段从引用根节点开始标记…...
计算机毕业设计--基于深度学习(U-Net与多尺度ViT)的车牌模糊图像修复算法设计与实现(含Github代码+Web端在线体验界面)
基于深度学习的U-Net架构下多尺度Transformer车牌图像去模糊算法设计与实现 如果想对旧照片进行模糊去除,划痕修复、清晰化,请参考这篇CSDN作品👇 计算机毕业设计–基于深度学习的图像修复(清晰化划痕修复色彩增强)算…...
塑料材料工程师简历模板
模板信息 简历范文名称:塑料材料工程师简历模板,所属行业:其他 | 职位,模板编号:DEEBPX 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工…...
Nginx核心功能与LNMP部署
目录 一、引言 二、Nginx 简介 2.1 Nginx 的起源与发展 2.2 Nginx 的特点 三、Nginx 核心功能详解 3.1 HTTP 服务器功能 3.1.1 静态资源处理 3.1.2 HTTP 协议支持 3.2 反向代理功能 3.2.1 反向代理的原理 3.2.2 Nginx 反向代理配置 3.3 负载均衡功能 3.3.1 负载均…...