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

Maven 实现多模块项目依赖管理

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

文章目录

  • Maven 实现多模块项目依赖管理
    • 引言
    • 第一章:父POM的全局版本锁定
      • 1.1 依赖管理机制的演进之路
      • 1.2 企业级父POM设计规范
      • 1.3 版本锁定的实现原理
      • 1.4 多级继承的陷阱与规避
    • 第二章:子模块依赖的继承与覆盖机制
      • 2.1 依赖决议的优先级体系
      • 2.2 版本覆盖的典型场景
      • 2.3 依赖范围(Scope)的继承规则
      • 2.4 依赖排除(Exclusion)的级联影响
    • 第三章:传递依赖的精准控制策略
      • 3.1 依赖调解机制解密
      • 3.2 排除(Exclusions)的进阶用法
      • 3.3 可选依赖(Optional)的双刃剑
    • 第四章:深度解析特殊依赖范围
      • 4.1 import scope的魔法解密
      • 4.2 system scope的危险游戏
      • 4.3 runtime scope的微妙之处
    • 第五章:企业级依赖治理方案
      • 5.1 依赖关系可视化
      • 5.2 自动化依赖升级策略
      • 5.3 多构建工具的统一管理
    • 参考文献

Maven 实现多模块项目依赖管理

引言

在数字化转型的浪潮中,软件系统正以前所未有的速度向复杂化、规模化演进。以某头部电商平台为例,其核心系统已包含超过200个相互关联的微服务模块,每个模块又聚合了数十个第三方组件库。这种架构演进带来一个棘手的挑战:如何在保证开发效率的同时,确保整个系统的依赖关系清晰可控?

依赖管理绝非简单的版本号堆砌,它直接关系到构建稳定性、安全合规和团队协作效率。试想这样的场景:当Log4j漏洞爆发时,如何快速定位所有受影响模块?当两个子模块分别依赖不同版本的Guava库时,如何避免运行时的方法缺失?这些问题若处理不当,轻则导致构建失败,重则引发生产环境事故。

Maven作为Java生态的主流构建工具,其依赖管理机制经过多年演进已形成完整体系。但许多开发者仅停留在基础使用层面,对多模块项目的深度管理缺乏系统认知。

本文将深入剖析dependencyManagement的版本仲裁机制、子模块依赖的继承规则、传递依赖的精准控制等核心话题,并通过真实案例展示如何构建企业级的依赖治理方案。我们将揭示大型互联网公司在超大规模项目中的实战技巧。

第一章:父POM的全局版本锁定

1.1 依赖管理机制的演进之路

Maven 2.0之前,多模块项目的版本管理如同走钢丝。各子模块独立声明依赖版本,导致以下典型问题:

  1. 版本碎片化:不同模块使用同一依赖的不同版本
  2. 升级困难:安全补丁需要逐个模块修改
  3. 冲突排查耗时:依赖树分析犹如大海捞针

2005年引入的dependencyManagement机制彻底改变了这一局面。其核心思想是将版本声明与使用解耦,通过父POM集中管理所有依赖的坐标和版本,子模块只需声明groupIdartifactId。这种模式与现代微服务架构的配置中心思想不谋而合。

1.2 企业级父POM设计规范

一个健壮的父POM应遵循以下设计原则:

<dependencyManagement><dependencies><!-- 第三方组件 --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.2-jre</version></dependency><!-- 内部基础库 --><dependency><groupId>com.company.platform</groupId><artifactId>common-utils</artifactId><version>${internal.lib.version}</version></dependency></dependencies>
</dependencyManagement><properties><internal.lib.version>1.5.0-RELEASE</internal.lib.version><junit.version>5.9.3</junit.version>
</properties>

版本声明的最佳实践:

  1. 按来源分类管理:第三方库、内部组件、测试框架等分区声明
  2. 属性化版本号:对高频更新的依赖使用properties变量
  3. 兼容性矩阵:维护Spring BootSpring Cloud等关联组件的版本对应表
  4. 安全基线:通过OWASP Dependency-Check等工具建立漏洞版本黑名单

1.3 版本锁定的实现原理

当子模块继承父POM时,Maven会构建一个依赖决策树:

  1. 解析子模块的显式依赖声明
  2. 向上查找父POM的dependencyManagement
  3. 比对groupIdartifactId进行版本匹配
  4. 应用最近优先原则(nearest definition wins

这个过程的算法复杂度为O(n),其中n是依赖树深度。在大型项目中,合理的层次划分能将解析时间控制在合理范围内。

1.4 多级继承的陷阱与规避

某金融系统曾因四级POM继承导致构建失败:

Root Parent
└── Platform Parent└── Service Parent└── Account Service

问题根源在于中间层POM覆盖了根父POM的JUnit版本。解决方案:

  1. 限制继承层级不超过3级
  2. 使用BOM(Bill of Materials)替代深层继承
  3. 在根父POM显式锁定测试框架版本
<!-- 根父POM确保最终控制权 -->
<dependencyManagement><dependencies><dependency><groupId>org.junit</groupId><artifactId>junit-bom</artifactId><version>${junit.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

第二章:子模块依赖的继承与覆盖机制

2.1 依赖决议的优先级体系

Maven依赖决议遵循精确匹配优先原则,其优先级从高到低为:

  1. 子模块dependencies中的显式版本声明
  2. 子模块dependencyManagement中的版本
  3. 父POM的dependencyManagement
  4. 依赖的传递版本

这种机制确保了灵活性,但也需要规范约束。某电商平台的规范要求:

  • 基础服务模块必须继承父版本
  • 业务模块允许按需覆盖,但需经过架构评审
  • 禁止在子模块dependencyManagement中声明新依赖

2.2 版本覆盖的典型场景

场景一:模块级兼容性适配

支付模块需要兼容老版本的支付宝SDK:

<!-- 支付模块pom.xml -->
<dependencies><dependency><groupId>com.alipay</groupId><artifactId>alipay-sdk</artifactId><version>3.7.110</version> <!-- 覆盖父POM的4.0+版本 --></dependency>
</dependencies>

场景二:环境差异化配置

测试环境使用嵌入式数据库:

<profile><id>test</id><dependencies><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>2.1.214</version><scope>test</scope></dependency></dependencies>
</profile>

2.3 依赖范围(Scope)的继承规则

Scope的继承具有以下特点:

Scope是否继承可覆盖性典型使用场景
compile核心业务依赖
provided容器提供的Servlet API
runtimeJDBC驱动等运行时依赖
test-单元测试框架
system本地特殊jar包

某物流系统曾因误覆盖runtime scope导致ClassNotFound

<!-- 错误示例 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>compile</scope> <!-- 应继承父POM的runtime -->
</dependency>

2.4 依赖排除(Exclusion)的级联影响

排除传递依赖时需考虑级联效应:

<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><exclusions><exclusion><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId></exclusion></exclusions>
</dependency>

此时需注意:

  1. 排除是传递性的,所有依赖路径都会生效
  2. 可能破坏被依赖库的功能完整性
  3. 建议配合dependency:tree分析影响范围

第三章:传递依赖的精准控制策略

3.1 依赖调解机制解密

Maven通过依赖调解(Dependency Mediation)解决版本冲突,其核心规则:

  1. 最近定义优先(Nearest Definition
  2. 最先声明优先(First Declaration

这两种规则的实际效果可以通过示例说明:

A -> B -> C 1.0
A -> D -> C 2.0

此时C 2.0会被选中,因为路径A->D->C(2.0)比A->B->C(1.0)更近

A -> B 1.0 -> C 1.0
A -> B 2.0 -> C 2.0 

如果B 1.0在POM中先声明,则C 1.0胜出

3.2 排除(Exclusions)的进阶用法

全局排除配置示例:

<!-- 在父POM中全局排除有漏洞的日志组件 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-to-slf4j</artifactId></exclusion></exclusions></dependency></dependencies>
</dependencyManagement>

这种方式的优点:

  • 统一安全管控
  • 避免每个子模块重复配置
  • 与漏洞扫描工具联动实现自动排除

3.3 可选依赖(Optional)的双刃剑

可选依赖的声明方式:

<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.3.6</version><optional>true</optional>
</dependency>

使用注意事项:

  • 不会传递到依赖当前模块的其他模块
  • 适合提供扩展功能的场景
  • 需要显式声明才能使用,增加了使用方的认知成本

某大数据平台误用optional导致的问题:

  • 核心模块将HBase客户端设为optional
  • 但多个业务模块都需要使用HBase
  • 最终导致重复声明,版本不一致

第四章:深度解析特殊依赖范围

4.1 import scope的魔法解密

import scope的革命性在于将BOMBill of Materials)引入依赖管理:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2022.0.4</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

与传统继承方式的对比:

特性继承import scope
多继承支持否(单继承)是(多个BOM)
覆盖灵活性
元数据可见性完全可见仅依赖管理部分
构建速度较慢(需解析额外POM)

4.2 system scope的危险游戏

system scope允许引用本地jar包:

<dependency><groupId>com.legacy</groupId><artifactId>old-system</artifactId><version>1.0.0</version><scope>system</scope><systemPath>${project.basedir}/lib/old-system.jar</systemPath>
</dependency>

适用场景:

  • 无法通过仓库获取的遗留jar包
  • 本地原型开发阶段的临时依赖
  • 特殊许可证限制的私有库

但必须注意:

  1. 破坏构建的可移植性
  2. 需要手动管理jar包版本
  3. 可能引入安全漏洞

某企业的惨痛教训:

  • 20个模块使用system scope引用本地加密库
  • 某次服务器迁移未拷贝lib目录
  • 导致持续集成全线失败

4.3 runtime scope的微妙之处

runtime scope的典型使用场景:

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

其行为特征:

  • 编译时不可见
  • 测试和运行时包含
  • 不会传递到其他模块

这与provided scope形成对比:

  • provided:容器提供,不会打包
  • runtime:需要打包,但编译不参与

第五章:企业级依赖治理方案

5.1 依赖关系可视化

推荐工具组合:

  1. Maven Dependency Plugin
    mvn dependency:tree -Dincludes=com.google.guava
    
  2. Eclipse MATMemory Analyzer Tool
  3. Sonatype Nexus的组件分析功能

某银行系统的依赖治理流程:

  1. 每日构建生成全量依赖树
  2. 与许可白名单比对,拦截违规组件
  3. 自动生成依赖变更报告
  4. 架构委员会审核关键版本升级

5.2 自动化依赖升级策略

智能升级方案设计:

新版本发布
监控仓库元数据
安全扫描
是否通过
创建PR
记录到黑名单
自动化测试
测试通过
自动合并
通知团队

关键要素:

  • 基于语义化版本(SemVer)的自动兼容性判断
  • OWASP Dependency-Check集成
  • 金丝雀发布策略

5.3 多构建工具的统一管理

在混合技术栈环境中(如Maven+Gradle),建议:

  1. 使用Gradle的mavenBom导入:
    dependencies {implementation platform('org.springframework.boot:spring-boot-dependencies:3.1.5')
    }
    
  2. 维护中央依赖版本文件(versions.toml)
  3. 通过自定义插件同步版本信息

参考文献

  1. Apache Maven Project. (2023). Maven Dependency Mechanism. https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
  2. O’Brien, T. (2021). Advanced Dependency Management in Maven. O’Reilly Media.
  3. Spring Team. (2023). Spring Boot Dependencies BOM. https://docs.spring.io/spring-boot/docs/current/reference/html/dependency-versions.html
  4. Sonatype. (2023). State of the Software Supply Chain Report. https://www.sonatype.com/resources/state-of-the-software-supply-chain
  5. IEEE Computer Society. (2022). Secure Software Dependency Management Guidelines. IEEE Standard 2830-2022

相关文章:

Maven 实现多模块项目依赖管理

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【JavaScript-Day 2】开启 JS 之旅:从浏览器控制台到 `<script>` 标签的 Hello World 实践

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

Windows 中使用dockers创建指定java web 为镜像和运行容器

以下是在 Windows 中使用 Docker 创建 Java Web 应用镜像并运行容器的分步指南&#xff1a; 步骤 1&#xff1a;安装 Docker 下载并安装 Docker Desktop for Windows启动 Docker Desktop&#xff0c;确保使用 WSL 2 后端&#xff08;推荐&#xff09;或 Hyper-V。 步骤 2&…...

机器人--MCU

MCU MCU&#xff08;Microcontroller Unit&#xff0c;微控制器&#xff09; 是机器人的“神经末梢”&#xff0c;负责 实时控制、传感器接口、低层通信 等关键任务。 作用 MCU的核心作用 功能具体任务示例实时控制电机PWM生成、PID调节、紧急制动机械臂关节控制、无人机电调…...

从融智学视域快速回顾世界历史和主要语言文字最初历史证据(列表对照分析比较)

融智学视域下世界历史与语言文字起源对照分析表 以下从融智学五个基本范畴&#xff08;物、意、文、道、理义法&#xff09;&#xff0c;梳理主要古代文明的文字起源&#xff0c;及其历史证据&#xff0c;并进行跨文明比较&#xff1a; 文明/文字 物&#xff08;载体&#xf…...

JavaScript性能优化实战(8):缓存策略与离线优化

前言 在Web应用中,性能优化不仅仅是关于代码执行速度,还与资源获取和数据持久化密切相关。合理的缓存策略可以显著减少网络请求,提升应用响应速度,同时有效降低服务器负载和用户流量消耗。离线优化则进一步解决了网络不稳定或断网场景下的用户体验问题,为Web应用提供类似…...

quantization-大模型权重量化简介

原文地址 https://towardsdatascience.com/introduction-to-weight-quantization-2494701b9c0c/ https://towardsdatascience.com/4-bit-quantization-with-gptq-36b0f4f02c34/ 权重量化简介 大型语言模型(LLM) 以其庞大的计算需求而闻名。通常&#xff0c;模型的大小是通过将参…...

unity ScriptObject的使用

1.先定义一个类数据类型 [Serializable] public class FoodItemData { public int foodID; // 食物唯一ID public string foodName; // 食物名称 [TextArea(3, 10)] // 多行文本输入 public string description; // 食物描述 pu…...

广义线性模型三剑客:线性回归、逻辑回归与Softmax分类的统一视角

文章目录 广义线性模型三剑客&#xff1a;线性回归、逻辑回归与Softmax分类的统一视角引言&#xff1a;机器学习中的"家族相似性"广义线性模型(GLMs)基础三位家族成员的统一视角1. 线性回归(Linear Regression)2. 逻辑回归(Logistic Regression)3. Softmax分类(Softm…...

Linux时钟与时间API

深入理解 Linux 时钟与时间 API 时间是计算领域的基础概念之一。在 Linux 系统中&#xff0c;精确可靠的时间管理对于系统日志记录、任务调度、网络通信、性能分析、文件系统操作乃至应用程序的正确运行都至关重要。本文将深入探讨 Linux 中的时钟类型、相关的 C API、使用示例…...

闭包(Closure)及其作用和影响

一、闭包是什么 闭包&#xff08;Closure&#xff09;指的是​​一个函数能够记住并访问其词法作用域&#xff08;lexical scope&#xff09;&#xff0c;即使该函数在其词法作用域之外执行​​。换句话说&#xff0c;闭包让函数可以“记住”它被创建时的环境。 闭包的核心特…...

toLua笔记

基本 LuaState luaStatenew LuaState(); luaState.Start(); luaState.DoString("xxx"); luaState.DoFile("yyy.lua"); luaState.Require("zzz");//不要加.lua后缀 luaState.CheckTop();//检查解析器栈顶为空 luaState.Dispose(); luaStatenull;…...

20:深度学习-多层感知器原理

深度学习-多层感知器的原理 ------------------常州龙熙机器视觉培训班-课程资料 1.单层感知机 多层感知机是由感知机推广而来&#xff0c;感知机学习算法(PLA: Perceptron Learning Algorithm)用神经元的结构进行描述的话就是一个单独的。 首先了解下单层感知机: b--常量 …...

高频数据冲击数据库的技术解析与应对方案

目录 前言一、问题现象与影响分析1.1 典型场景表现1.2 核心问题分类 二、失效根源深度剖析2.1 架构设计缺陷2.2 缓存策略缺陷 三、解决方案与最佳实践3.1 缓存架构设计3.1.1 分层缓存架构3.1.2 热点数据识别 3.2 缓存策略优化3.2.1 动态过期时间算法3.2.2 缓存更新策略对比 3.3…...

(37)VTK C++开发示例 ---纹理地球

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 将图片纹理贴到球体上&#xff0c;实现3D地球的效果。 该代码使用了 VTK (Visualization Toolkit) 库来创建一个纹理…...

LeetCode - 1137.第N个泰波那契数

目录 题目 解法 动态规划解法 核心思想 执行流程 具体例子 时间复杂度和空间复杂度 代码 题目 1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; 解法 动态规划解法 核心思想 动态规划是一种通过将复杂问题分解为更小子问题来解决的算法方法。我将…...

智能决策支持系统的系统结构:四库架构与融合范式

前文我们已经了解了智能决策支持系统的基本概念以及基本构件&#xff0c;接下来我们了解一下系统结构。 有关“智能决策支持系统的基本概念”的内容&#xff0c;可看我文章&#xff1a;智能决策支持系统的基本概念与理论体系-CSDN博客 有关“智能决策支持系统的基本构建”的…...

单片机裸机环境下临界区保护

目录 1、直接中断屏蔽法 2、嵌套计数优化法 3、BASEPRI寄存器应用 4、动态优先级调整策略 5、LDREX/STREX指令应用 6、位带别名区原子访问 7、上下文感知保护 8、中断延迟优化技术 在嵌入式系统开发中&#xff0c;临界区保护是确保系统可靠性的关键技术。本文以ARM Cor…...

【数字电路】第六章 时序逻辑电路

一、时序逻辑电路概述 1.逻辑电路的分类 2.时序逻辑电路的一般结构形式 3.时序逻辑电路的描述方法 4.时序逻辑电路按触发器动作特点分类 5.时序逻辑电路按输出信号特点分类 6.常用时序逻辑电路 二、同步时序逻辑电路的分析 1.同步时序逻辑电路的分析方法 TTL触发器允许输入端…...

Spring Boot的GraalVM支持:构建低资源消耗微服务

文章目录 引言一、GraalVM原生镜像技术概述二、Spring Boot 3.x的GraalVM支持三、适配GraalVM的关键技术点四、构建原生镜像微服务实例五、性能优化与最佳实践总结 引言 微服务架构已成为企业应用开发的主流模式&#xff0c;但随着微服务数量的增加&#xff0c;资源消耗问题日…...

MySQL中的窗口函数

深入理解窗口函数&#xff08;Window Functions&#xff09; 窗口函数确实经常用于分组后为行分配序号&#xff08;如1,2,3…&#xff09;&#xff0c;但它的功能远不止于此。窗口函数是SQL中极其强大的分析工具&#xff0c;可以让你在不减少行数的情况下进行复杂计算。 窗口函…...

WITH在MYSQL中的用法

WITH 子句&#xff08;也称为公共表表达式&#xff0c;Common Table Expression&#xff0c;简称 CTE&#xff09;是 SQL 中一种强大的查询构建工具&#xff0c;它可以显著提高复杂查询的可读性和可维护性。 一、基本语法结构 WITH cte_name AS (SELECT ... -- 定义CTE的查询…...

人工智能:如何快速筛选出excel中某列存在跳号的单元格位置?

前提&#xff1a; 电脑上必须提前安装好了【office AI】软件工具 方法如下&#xff1a; 1、打开要操作的excel表格&#xff0c;点击上方的【officeAI】&#xff0c;再点击左边的【右侧面板】按钮&#xff0c;就会出现如下右侧的【OfficeAI助手】 2、在OfficeAI助手的聊天框…...

动态功耗与静态功耗

0 英文缩写 SOI&#xff08;Silicon on Insulator&#xff09;绝缘体上硅FET&#xff08;Field-Effect Transistor&#xff09;场效应管CMOS&#xff08;Complementary Metal Oxide Semiconductor&#xff09;互补金属氧化物半导体 1 功耗分类 CMOS电路功耗主要可以通过如下…...

Webug4.0靶场通关笔记10- 第14关链接注入

目录 第14关 链接注入 1.打开靶场 2.源码分析 3.渗透实战 &#xff08;1&#xff09;方法1&#xff1a;跳转外部网页 &#xff08;2&#xff09;方法2&#xff1a;获取cookie 4.漏洞防御 本文通过《webug靶场第14关 链接注入》来进行渗透实战。 第14关 链接注入 链接注…...

PyTorch_指定运算设备 (包含安装 GPU 的 PyTorch)

PyTorch默认会将张量创建在 CPU 控制的内存中&#xff0c;即&#xff1a;默认的运算设备为 CPU。我们也可以将张量创建在 GPU 上&#xff0c;能够利用对于矩阵计算的优势加快模型训练。 将张量移动到 GPU 上有两种方法&#xff1a; 使用 cuda 方法直接在 GPU 上创建张量使用 …...

Pytorch-CUDA版本环境配置

Pytorch-CUDA版本环境配置 电脑如果是Windows平台下的Nvidia GPU的用户&#xff0c;需配置Pytorch的CUDA版本&#xff0c;分为三步&#xff1a; 1. 安装或更新NVIDA显卡驱动 官方驱动下载地址&#xff1a; https://www.nvidia.cn/Download/index.aspx?langcn 2. 安装CUDA To…...

力扣:24两两交换链表的节点

目录 1.题目描述&#xff1a; 2.算法思路&#xff1a; 3.代码展示&#xff1a; 1.题目描述&#xff1a; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能…...

SETNX的存在问题和redisson进行改进的原理

首先分布式锁的原理就是当锁不存在时则创建&#xff0c;创建到锁的线程则执行业务。但是在这些操作中会有一些问题&#xff0c;下面是redis命令setNX设置锁的代码片段 if(缓存中有){返回缓存中的数据 }else{获取分布式锁if(获取锁成功&#xff09;{try{查询数据库}finally{释放…...

抽象工厂模式(Abstract Factory Pattern)

很好&#xff01;你现在已经开始接触设计模式了&#xff0c;而**抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种常用于“创建一系列相关产品”**的经典设计模式。 我会一步步帮你理解&#xff1a; &#x1f9e0; 一句话解释 抽象工厂模式&#xff1a;提…...

AVIOContext 再学习

这个目前阶段用的不多&#xff0c;暂时不要花费太多精力。 url 的格式不同&#xff0c;使用的传输层协议也不同。这块看代码还没看到自己想的这样。 目前看的信息是&#xff1a;avformatContext 的 io_open 回调函数 在默认情况下叫 io_open_default&#xff0c;在解复用的 av…...

Power Query精通指南1:查询结构设计、数据类型、数据导入与迁移(平面文件、Excel、Web)

文章目录 零、Power Query简介0.1 Power Query 主要功能0.2 Power Query 的优势0.3 Power Query 组件 一、Power Query数据处理基本流程1.1 前期准备1.2 提取1.3 转换1.3.1 Power Query 编辑器界面1.3.2 默认转换1.3.3 自定义转换 1.4 加载1.4.1 自动检测数据类型1.4.2 重命名查…...

Linux 内核升级问题

一、内核升级后启动失败 原因&#xff1a;initramfs 镜像未正确生成或 GRUB 配置错误。 处理步骤如下&#xff1a; 1、进入旧内核启动系统。 2、重新生成 initramfs&#xff1a; sudo dracut -f --regenerate-all 3、更新 GRUB 配置&#xff1a; sudo grub2-mkconfig -o /boo…...

Linux 进程间通信(IPC)详解

进程间通信&#xff08;IPC&#xff09;深入解析 一、进程间通信概述 在操作系统里&#xff0c;不同进程间常常需要进行数据交换、同步协调等操作&#xff0c;进程间通信&#xff08;Inter - Process Communication&#xff0c;IPC&#xff09;机制应运而生。在Linux系统中&a…...

第3章 Python 3 基础语法001

文章目录 一、缩进规则1. 基本规则2. 示例3. 多级缩进4. 常见错误二、注释规则1. 单行注释2. 多行注释3. 特殊注释4. 注释规范三、代码块规则1. 控制结构2. 函数定义3. 类定义4. 上下文管理器四、总结与最佳实践五、调试技巧以下是 Python 3 基础语法规则的详细说明,涵盖 缩进…...

数据库介绍以及windows下mysql安装

文章目录 1. 前言2. MySQL概述2.1 相关概念2.2 DBMS的分类2.3 数据库交互图2.4 MySQL 介绍 3. MySQL 安装 数据库介绍以及windows下mysql安装 1. 前言 我们浏览的淘宝商品页面详情、刷视频网站的一个个视频&#xff0c;这些数据其实都是存储在公司的存储系统中的。想象一下&…...

list的两种设计

1. 内存布局对比 (1) MSVC 的实现 cpp class _List_node {_List_node* _Next; // 指向下一个节点_List_node* _Prev; // 指向前一个节点_Value_type _Value; // 存储的数据 }; 特点&#xff1a; 每个节点包含两个指针和一个数据成员。 Debug 模式&#xff1a;可能添加迭代…...

【C#】一个类中的接口方法使用static和不使用static的区别

在C#中&#xff0c;类中的接口方法是否使用 static 修饰符会带来显著的区别。这是因为接口方法的实现和调用方式与普通方法不同&#xff0c;而 static 关键字的使用进一步改变了这些行为。 以下是两者的区别&#xff1a; 1. 不使用 static 的接口方法 在这种情况下&#xff0…...

共铸价值:RWA 联合曲线价值模型,撬动现实资产生态

摘要 本文提出了一种针对真实资产&#xff08;RWA&#xff09;产业的联合曲线激励模型&#xff0c;将劳动与数据贡献映射为曲线价值&#xff0c;并基于固定档位与指数衰减奖励发放总计 2.1亿积分。该模型结合了去中心化定价与平滑递减机制&#xff0c;不仅为早期贡献者提供更高…...

【libuv】基于libuv的exe链接错误

vs2017构建 基于libuv的exe链接错误 1>libuv.lib(util.obj) : error LNK2019: unresolved external symbol __imp__GetAdaptersAddresses20 referenced in function _uv_interface_addresses 1>libuv.lib(util.obj) : error LNK2019: unresolved external symbol __imp__…...

什么是生成式 AI (GenAI)?

在科技飞速发展的今天,人工智能(AI)已不再是一个遥远的概念,而是悄然融入了我们的日常生活。从智能语音助手到自动驾驶汽车,从个性化推荐系统到医疗诊断辅助,AI正以前所未有的速度改变着世界。然而,在AI的广阔领域中,有一个分支正逐渐崭露头角,成为推动未来创新的关键…...

爬虫准备前工作

1.Pycham的下载 网址&#xff1a;PyCharm: The only Python IDE you need 2.Python的下载 网址&#xff1a;python.org&#xff08;python3.9版本之后都可以&#xff09; 3.node.js的下载 网址&#xff1a;Node.js — 在任何地方运行 JavaScript&#xff08;版本使用18就可…...

JVM——JVM 是如何处理异常的?

JVM 是如何处理异常的&#xff1f; 在 Java 编程语言中&#xff0c;异常处理是一种强大的机制&#xff0c;用于应对程序运行时出现的错误和意外情况。而 Java 虚拟机&#xff08;JVM&#xff09;作为 Java 程序运行的核心环境&#xff0c;在异常处理过程中扮演着至关重要的角色…...

网络基础-----C语言经典题目(12)

一、MTU&#xff0c;IP 协议头中 TTL是什么&#xff1f; MTU 指的是网络层能够接收的最大数据包大小&#xff0c;单位为字节。主要作用是限制数据链路层一次能够传输的数据量。 IP 协议头中的 TTL 是 IP 数据头部的一个 8 位字段&#xff0c;最初它的设计目的是限制数据包在网络…...

【第十六届蓝桥杯省赛】比赛心得与经验分享(PythonA 组)

文章目录 一、我的成绩二、我的备赛经历三、如何备赛&#xff08;个人观点&#xff09;1. 基础语法2. 数据结构3. 算法4. 数学 四、做题技巧与注意事项五、我的题解试题A 偏蓝 &#x1f3c6;100%试题B IPV6 &#x1f3c6;0%试题C 2025图形 &#x1f3c6;100%试题D 最大数字 &am…...

解决Maven项目中报错“java不支持版本6即更高的版本 7”

错误背景 当Maven项目编译或运行时出现错误提示 Java不支持版本6即更高的版本7&#xff0c;通常是由于项目配置的JDK版本与当前环境或编译器设置不一致导致的。例如&#xff1a; 项目配置的Java版本为6或7&#xff0c;但实际使用的是JDK 17。Maven或IDE的编译器未正确指定目标…...

MySQL--索引入门

MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 Mysql在存储数据之外&#xff0c;数据库系统各种还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用&#xff08;指向&#xff09;表中的数据…...

【网络原理】深入理解HTTPS协议

本篇博客给大家带来的是网络原理的知识点, 由于时间有限, 分三天来写, 本篇为线程第三篇,也是最后一篇. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动…...

利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb

题目信息: This new atom bomb early warning system is quite strange… 题目使用 elixir 语言 一开始,我们会访问 /page.html <!DOCTYPE html> <!-- 设定文档语言为英语 --> <html lang"en"> <head><!-- 设定字符编码为UTF-8 --><…...

机器人--STM32

STM32启动模式 1,从主闪存存储启动器启动(默认) 2,从系统存储启动器启动 下载程序时需要使用的启动方式。 3&#xff0c;从内置的SRAM启动...