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

利用FatJar彻底解决Jar包冲突(三)

利用FatJar彻底解决Jar包冲突

  • Spring 容器的加载与隔离
    • ⽀持注解
    • 配置⽂件定位与容器初始化
    • 嵌套Spring容器的加载
  • 隔离优化
  • EagleEye traceId不⼀致问题
    • 原因
    • 解决

Spring 容器的加载与隔离

⽀持注解

这个⽐较容易,主要是我们之前的应⽤不⽀持⼆⽅包内部的注解,现在在隔离的情况下通过配置⽂件设置component-scan 来⽀持@Resource,@PostConstruct,@Component 注解。
在这里插入图片描述
在这里插入图片描述

配置⽂件定位与容器初始化

由于FatJarClassLoader为我们所有,因此使⽤ClassPathXmlApplicationContext通过classpath的⽅式定位配置⽂件最⽅便。 由于隔离,我们需要使⽤⼆⽅包中Spring的 来初始化容器,通过反射调⽤:
在这里插入图片描述
如果直接从构造函数中传⼊xml路径会提示⽂件找不到,通过debug和分析,唯⼀的原因就是在定位classpath的时候使⽤的 不是FatJarClassLoader,接下来⼀步步分析相关源码。
定位最初传⼊(创建)classloader的位置在DefaultResourceClassloader类:
在这里插入图片描述
getClassloader⽅法返回的是该类的属性,在构造函数中初始化:
在这里插入图片描述
初始化时调⽤ClassUtils的getDefaultClassLoader⽅法:
在这里插入图片描述
同时DefaultResourceLoader也提供了setClassloader⽅法设置属性:
在这里插入图片描述
⽽ClassPathXmlApplicationContext是继承⾃DefaultResourceLoader,⼤致加载类图如下:
在这里插入图片描述
现在就是要找可以hack的地⽅了,即在定位配置⽂件前设置classloader,如果直接使⽤带参的构造函数,调⽤的⽅法如下:
在这里插入图片描述
所以可以使⽤⽆参的构造函数创建实例之后设置classloader,设置配置⽂件位置,最后refresh:
在这里插入图片描述

嵌套Spring容器的加载

在迁移某个二方包业务时,发现它使⽤了地址库的jar,⽽地址库本身也使⽤了Spring容器,通过直接创建 ClassPathXmlApplicationContext带参(配置⽂件位置)构造函数初始化⾃身的Spring容器。这样我们就⽆法再修改地址库 配置⽂件加载流程了,下图是⽬前Spring容器结构:
在这里插入图片描述
根据上⼀节的分析,我们知道ClassUtils的getDefaultClassLoader⽅法返回的当前线程上下⽂的ClassLoader:
在这里插入图片描述
因此,这边我们只能通过设置当前线程的ContextClassLoader来确保容器中的容器能从ClassPath加载到配置⽂件并成功初始化容器。

隔离优化

由于完全隔离,⼆⽅包和应⽤⽆法共享⼀些通⽤的⼯具类⽐如中间件,这样对于应⽤和⼆⽅包都需要使⽤中间件且中间件 不⽀持同时创建多个实例(因为不同classloader加载的相同类实际是不同的两个类)。⽐如在迁移智能发货过程中发现应 ⽤和⼆⽅包都使⽤了Switch,⽽Switch是通过服务端推送的⽅式更新客户端,这就需要客户端开启端⼝监听,由于服务端 是向固定端⼝发送请求的所以⼆⽅包或应⽤会通知不到;再⽐如 HSFprovider也会开启端⼝监听,开启同⼀个端⼝的时候会出错。虽然⽬前是通过折中的⽅式解决的,⽐如利⽤Diamond代替Switch,或者在应⽤层不使⽤HSF provider,只由⼆⽅包 ⾃⼰提供HSF 接⼝。但是这种⽅式明显不是⻓久之际,最终⽅案应该是类共享与隔离共存。如何实现类共享?⼀开始想到 的⽅案是利⽤委托机制,在加载AppClassloader前先创建 SDKClassloader,由SDKClassLoader加载公共类,并创建 AppClassLoader和FatJarClassLoader,并把SDKClassLoader作为他俩的parent。同时容器层⾯将应⽤的Spring容器作为⼆⽅包容器的⽗容器,如图:
在这里插入图片描述
这种⽅式⼀个很⼤的缺点是需要在AppClassLoader创建之前就创建SDKClassLoader,这就需要修改系统启动时的默认 ClassLoader。
另⼀种⽅案是在⿊客⻢拉松时和队友讨论出来的,参考pandora插件隔离与共享的⽅式,使⽤⼀个Map缓存共享类,FatJarClassLoader优先从Map加载类。
在这里插入图片描述

EagleEye traceId不⼀致问题

原因

在迁移某个业务过程中,发现由于应⽤和⼆⽅包使⽤的是不同的classloader,即EagleEye也是不同的两个类。由于不同 classloader context不同,在通过反射调⽤服务的时候应⽤和⼆⽅包打印的eagle eye traceId不⼀致,需要在调⽤前设置 context并在调⽤完成之后恢复,类似加载Spring容器时设置的contextClassLoader。

解决

通过询问EagleEye相关的同学,发现EagelEye提供了设置context的⽅法,现在就是怎么设置的问题了。从之前的分析中我 们知道应⽤和⼆⽅包使⽤的是两个不同的ClassLoader即两个EagleEye,现在就需要设置⼆⽅包加载的EagleEye的context即 可,通过反射设置:
在这里插入图片描述
在调⽤⼆⽅包中服务逻辑⽅法前设置并在调⽤后恢复(为了不影响⼆⽅包⾃身内部的 traceId 获取)即可:
在这里插入图片描述

相关文章:

利用FatJar彻底解决Jar包冲突(三)

利用FatJar彻底解决Jar包冲突 Spring 容器的加载与隔离⽀持注解配置⽂件定位与容器初始化嵌套Spring容器的加载 隔离优化EagleEye traceId不⼀致问题原因解决 Spring 容器的加载与隔离 ⽀持注解 这个⽐较容易,主要是我们之前的应⽤不⽀持⼆⽅包内部的注解&#xf…...

【TMS570LC4357】之工程创建

备注:具体资料请在官网海淘.TMS570LC4357资料 1. 下载软件 官网下载对应的编译编辑工具如下图,主要是这两个,其它Flash工具等酌情考虑 安装软件,一直next就可以。安装后新建工程 2. 新建工程 如果不知道怎么建工程&#xff0…...

工作记录 2016-12-22

工作记录 2016-12-22 更新的问题 1、修改了Job Summary的Bill Amount的Bug。 2、修改了Account #的宽度。 3、修改了Clearinghouse Status的默认查询的条件。 4、修改了Upload Files的Add File的bug。 5、Pending Pool、Missing Infos加了Write Off,修改了Histor…...

若依-导出后端解析

针对若依框架微服务版本学习 若依导入导出功能的具体使用详见:后台手册 | RuoYi 1.导出逻辑: 导出文件的逻辑是先创建一个临时文件,等待前端请求下载结束后马上删除这个临时文件。但是有些下载插件,例如迅雷(他们是二…...

【QT5 Widgets示例】记事本:(二)界面设计

文章目录 记事本:(二)界面设计设置窗口标题和图标创建菜单工具栏创建文本框 记事本:(二)界面设计 设置窗口标题和图标 标题 点击窗口,修改windowTitle项 图标 点击windowIcon 倒三角&#xf…...

MPPT与PWM充电原理及区别详解

MPPT(最大功率点跟踪)和PWM(脉宽调制)是太阳能充电控制器中常用的两种技术,它们在原理、效率和适用场景上有显著区别。以下是两者的详细对比: 1. 工作原理 PWM(脉宽调制) 核心机制…...

K8S 集群搭建——cri-dockerd版

目录 一、工作准备 1.配置主机名 2.配置hosts解析 3.配置免密登录(只需要在master上操作) 4.时间同步(每台节点都要做,必做,否则可能会因为时间不同步导致集群初始化失败) 5.关闭系统防火墙 6.配置…...

使用express创建服务器保存数据到mysql

创建数据库和表结构 CREATE DATABASE collect;USE collect;CREATE TABLE info (id int(11) NOT NULL AUTO_INCREMENT,create_date bigint(20) DEFAULT NULL COMMENT 时间,type varchar(20) DEFAULT NULL COMMENT 数据分类,text_value text COMMENT 内容,PRIMARY KEY (id) ) EN…...

ubuntu-学习笔记-nginx+php

nginxphp nginx下载nginx配置nginx.conf php其他 记录一下在ubuntu中nginxphp部署tp项目 nginx nginx就是正常下载 下载nginx sudo apt-get install nginx tp项目版本是3.2,通过设置路由,以域名/api.php/控制器/xxx的格式进行api的调用,文…...

打造智能聊天体验:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果: PixPin_2025-02-19_09-15-59 效果图: 目录 项目概述功能特点环境准备项目结构组件详解 ChatContainerChatInputMessageBubbleTypeWriter 核心代码示例使用指南常见问题 项目概述 基于 Vue 3 TypeScrip…...

github生成badges的方法

在Github页面上生成类似下面这样的badge的方法 你可以通过以下步骤在GitHub个人主页的README中创建类似的技术栈徽章: 一、使用 Shields.io 生成徽章 Shields.io 是一个开源徽章生成工具,支持自定义文本、颜色、图标等参数。 1. 基础模板 https://…...

vulnhub靶场渗透之SickOs1.2渗透教程,计划任务提权、chkrootkit提权

vulnhub靶场渗透之SickOs1.2渗透教程,计划任务提权、chkrootkit提权 一、信息收集 1、首先拿到靶场先扫一下ip 2025.3.7 AM 8:36 arp-scan -l 扫描同网段 nmap -sP 192.168.66.24/02、指纹扫描 nmap -sS -sV 192.168.66.130 指纹扫描PORT STATE S…...

Ubuntu系统部署.NET 8网站项目

一、使用XShell连接 Ubuntu系统初次连接时默认的用户名为:ubuntu,使用此用户名与系统登录密码进行连接。 登录成功效果如下图: 二、root用户登录 linux下有超级用户(root)和普通用户,普通用户不能直接操…...

CI/CD—Jenkins配置一次完整的jar自动化发布流程

背景: 实现设想: 要创建自动化发布,需要准备一台测试服务器提前安装好java运行所需的环境,JDK版本最好和Windows开发机器上的版本一致,在Jenkins上配置将构建好的jar上传到测试服务器上,测试服务器自动启动…...

【Academy】Web 缓存欺骗 ------ Web cache deception

Web 缓存欺骗 ------ Web cache deception 1. 概述2. Web 缓存2.1 缓存键2.2 缓存规则 3. 构建 Web 缓存欺骗攻击3.1 使用缓存破坏器3.2 检测缓存的响应 4. 利用静态扩展缓存规则4.1 路径映射差异4.2 利用路径映射差异4.3 分隔符差异4.4 利用分隔符差异4.5 分隔符解码差异4.6 利…...

MATLAB表格Table与时间序列Timetable的高效操作方法

MATLAB中的表格(Table) 和 时间序列(Timetable) 是处理结构化数据和时间相关数据的核心工具。以下从基础操作到高级技巧,分步骤详解其使用方法。 一、创建与基础操作 1. 表格(Table)的创建与访…...

【leetcode hot 100 21】合并两个有序链表

解法一:新建一个链表存放有序的合并链表。当list1和list2至少有一个非空时,返回非空的;否则找出两个链表的最小值作为新链表的头,然后依次比较两链表,每次都先插入小的值。 /*** Definition for singly-linked list.*…...

本地部署 OpenManus 保姆级教程(Windows 版)

一、环境搭建 我的电脑是Windows 10版本,其他的没尝试,如果大家系统和我的不一致,请自行判断,基本上没什么大的出入啊。 openManus的Git地址:https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…...

20250310:OpenCV mat对象与base64互转

代码: https://github.com/ReneNyffenegger/cpp-base64 指南:https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/ 实操:...

WPS的付费功能,这款软件可完美平替

因为作者有工作上的需求加上WPS使用批量提取图片需要会员,所以自己使用cursor制作了一个从excel中提取图片的工具。 支持提取Excel中的浮动图片和根据图片链接来下载图片。 Excel Image Extractor Excel图片提取工具 软件的功能非常强大,支持提取Excel中…...

L1-088 静静的推荐

L1-088 静静的推荐 - 团体程序设计天梯赛-练习集 (pintia.cn) 题解 这里代码很简单,但是主要是循环里面的内容很难理解,下面是关于循环里面的内容理解: 这里 n 10 表示有 10 个学生,k 2 表示企业接受 2 批次的推荐名单&#…...

NS3学习——运行自定义拥塞控制算法步骤

目录 一、添加优化后的代码文件 二、更改CMakeLists文件中内容 三、重新配置和编译ns-3 四、常见问题 目的:想在tcp拥塞控制算法的基础上进行优化改进,之后在ns3中运行优化后的算法,即自定义拥塞控制算法; 以tcpVegas算法为…...

前端开发中的常见设计模式:全面解析与实践

1. 引言 1.1 设计模式的重要性 设计模式是软件开发中经过验证的解决方案,能够帮助开发者解决常见的设计问题。在前端开发中,合理使用设计模式可以提高代码的可维护性、可扩展性和复用性。 1.2 本文的目标 本文旨在全面解析前端开发中常见的设计模式&…...

VSCode 2025最新 前端开发必备插件推荐汇总(提效指南)

🌟前言: 如果你是一名前端开发工程师,合适的开发工具能大大提高工作效率。Visual Studio Code (VSCode) 凭借其轻量级、高扩展性的特点,已成为众多前端开发者在win系电脑的首选IDE。 名人说:博观而约取,厚积而薄发。—…...

【redis】redis的单线程模型为什么效率高?

文章目录 单线程模型单线程的 Redis 为什么效率高?速度快?IO多路复用epoll 单线程模型 Redis 只使用一个线程,处理所有的命令请求。不是说一个 Redis 服务器进程内部只有一个线程,其实也有多个线程,多个线程是在处理网…...

scala的集合

scala的集合系统的区分了可变( mutable )和不可变(immutable )集合。 mkString(seq:String):方法是将原字符串使用特定的字符串seq分割。 mkString(statrt:String,seq:String,end:String):方法是将原字符…...

Flink状态管理深度探索:从Keyed State到分布式快照

Flink状态管理深度探索:从Keyed State到分布式快照 在大数据实时计算领域,Apache Flink凭借其精准的状态管理能力成为行业标杆。本文将从状态管理的核心机制出发,结合金融行业PB级数据处理实践,深入解析状态后端、容错机制与大规模优化策略。 一、Flink状态管理核心架构 …...

Android 11 DAC和MAC

在 Android 11 中,DAC(Discretionary Access Control,自主访问控制) 和 MAC(Mandatory Access Control,强制访问控制) 是两种不同的访问控制机制,主要用于 权限管理、安全性 以及 进程间访问控制。 1. DAC(自主访问控制) DAC(Discretionary Access Control,自主访…...

平衡二叉树(AVL树)

平衡二叉树是啥我就不多说了,本篇博客只讲原理与方法。 首先引入平衡因子的概念。平衡因子(Balance Factor),以下简称bf。 bf 右子树深度 - 左子树深度。平衡结点的平衡因子可为:-1,0,1。除此…...

SSM架构 +java后台 实现rtsp流转hls流,在前端html上实现视频播放

序言:书接上文,我们继续 SSM架构 NginxFFmpeg实现rtsp流转hls流,在前端html上实现视频播放 步骤一:把rtsp流转化为hls流,用Java代码进行转换 package com.tools;import java.io.BufferedReader; import java.io.IOExc…...

贪心算法--

1.柠檬水找零 link:860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 贪心算法&#xff0c; 优先花出大面额bill&#xff0c; 尽可能保护小面额billint five 0, ten 0;// 不…...

【从0到1搞懂大模型】神经网络的实现:数据策略、模型调优与评估体系(3)

一、数据集的划分 &#xff08;1&#xff09;按一定比例划分为训练集和测试集 我们通常取8-2、7-3、6-4、5-5比例切分&#xff0c;直接将数据随机划分为训练集和测试集&#xff0c;然后使用训练集来生成模型&#xff0c;再用测试集来测试模型的正确率和误差&#xff0c;以验证…...

CTF工具集合-持续更新

工具地址https://github.com/huan-cdm/ctf_tools工具介绍&#xff1a; 1.ARCHPR&#xff1a;压缩包密码破解工具 2.StegSolve-1.4.jar&#xff1a;隐写图片查看工具 3.ctf_decrypt_tool.rar&#xff1a;随波逐流CTF编码工具 4.010_Editor_All_Versions_For_Windows_CracKed.…...

小方摄像头接入本地服务器的方法

最早众筹时买了几个小方摄像头&#xff0c;后来嫌弃分辨率&#xff0c;就淘汰吃灰好几年&#xff0c;最近想折腾个摄像头识别的小项目&#xff0c;秉着不投入先凑合跑起来的原则&#xff0c;想到了尘封已久的小方&#xff0c;想看看能不能通过网络拉取数据流。 搜索了下&#x…...

取反符号~

取反符号 ~ 用于对整数进行按位取反操作。它会将二进制表示中的每一位取反&#xff0c;即 0 变 1&#xff0c;1 变 0。 示例 a 5 # 二进制表示为 0000 0101 b ~a # 按位取反&#xff0c;结果为 1111 1010&#xff08;补码表示&#xff09; print(b) # 输出 -6解释 5 的二…...

Jenkins实现自动化构建与部署:上手攻略

一、持续集成与Jenkins核心价值 1.1 为什么需要自动化构建&#xff1f; 在现代化软件开发中&#xff0c;团队每日面临以下挑战&#xff1a; 高频代码提交&#xff1a;平均每个开发者每天提交5-10次代码。多环境部署&#xff1a;开发、测试、预发布、生产环境需频繁同步。复杂…...

爱普生温补晶振 TG5032CFN高精度稳定时钟的典范

在科技日新月异的当下&#xff0c;众多领域对时钟信号的稳定性与精准度提出了极为严苛的要求。爱普生温补晶振TG5032CFN是一款高稳定性温度补偿晶体振荡器&#xff08;TCXO&#xff09;。该器件通过内置温度补偿电路&#xff0c;有效抑制环境温度变化对频率稳定性的影响&#x…...

【Java 面试 八股文】计算机网络篇

操作系统篇 1. 什么是HTTP? HTTP 和 HTTPS 的区别?2. 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的&#xff1f;3. 如何理解UDP 和 TCP? 区别? 应用场景?3.1 TCP 和 UDP 的特点3.2 适用场景 4. 如何理解TCP/IP协议?5. DNS协议 是什么&#xff1f;说说DNS 完整的查询…...

OpenHarmony5.0分布式系统源码实现分析—软总线

一、引言 OpenHarmony 作为一款面向万物互联的操作系统&#xff0c;其分布式软总线&#xff08;Distributed SoftBus&#xff09;是实现设备间高效通信和协同的核心技术之一。分布式软总线通过构建一个虚拟的总线网络&#xff0c;使得不同设备能够无缝连接、通信和协同工作。本…...

Spring Boot/Spring Cloud 整合 ELK(Elasticsearch、Logstash、Kibana)详细避坑指南

我们在开发中经常会写日志&#xff0c;所以需要有个日志可视化界面管理&#xff0c;使用ELK可以实现高效集中化的日志管理与分析&#xff0c;提升性能稳定性&#xff0c;满足安全合规要求&#xff0c;支持开发运维工作。 下述是我在搭建ELK时遇到的许许多多的坑&#xff0c;希望…...

云原生周刊:Istio 1.25.0 正式发布

开源项目推荐 Dstack Dstack 是一个开源的 AI 计算管理平台&#xff0c;旨在简化 AI 任务的部署和管理。它支持本地和云端运行 AI 工作负载&#xff0c;并提供自动化的 GPU 资源调度&#xff0c;使开发者能够更高效地利用计算资源。Dstack 兼容 K8s&#xff0c;可以无缝集成到…...

微前端如何拯救大型项目

前言 在前端开发的世界中&#xff0c;我们经常会遇到这样的问题&#xff1a;一个大型项目往往由多个团队共同开发&#xff0c;每个团队负责一部分功能。然而&#xff0c;随着项目的不断扩大和复杂化&#xff0c;前端代码库变得越来越庞大和难以维护。这时&#xff0c;微前端&a…...

RabbitMQ 高级特性:从 TTL 到消息分发的全面解析 (下)

RabbitMQ高级特性 RabbitMQ 高级特性解析&#xff1a;RabbitMQ 消息可靠性保障 &#xff08;上&#xff09;-CSDN博客 RabbitMQ 高级特性&#xff1a;从 TTL 到消息分发的全面解析 &#xff08;下&#xff09;-CSDN博客 引言 RabbitMQ 作为一款强大的消息队列中间件&#xff…...

OpenManus-通过源码方式本地运行OpenManus,含踩坑及处理方案

前言&#xff1a;最近 Manus 火得一塌糊涂啊&#xff0c;OpenManus 也一夜之间爆火&#xff0c;那么作为程序员应该来尝尝鲜 1、前期准备 FastGithub&#xff1a;如果有科学上网且能正常访问 github 则不需要下载此软件&#xff0c;此软件是提供国内直接访问 githubGit&#…...

Ubuntu22.04修改root用户并安装cuda

由于本人工作原因&#xff0c;经常会遇到需要给ubuntu打显卡驱动的问题&#xff0c;虽然说不难吧&#xff0c;但是耐不住机器多&#xff0c;重复多次也就烦了&#xff0c;于是抽出了一点时间&#xff0c;并且在deepseek的帮助之下&#xff0c;写了一个自动安装驱动的脚本&#…...

Java LeetCode 热题 100 回顾38

干货分享&#xff0c;感谢您的阅读&#xff01;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两…...

MySQL复习笔记

文章目录 1.MySQL1.1什么是数据库1.2 数据库分类1.3 MySQL简介1.4连接数据库 2. 操作数据库2.1 操作数据库2.2 数据库的列类型2.3 数据库的字段属性&#xff08;重点&#xff09;2.4 创建数据库表&#xff08;重点&#xff09;2.5 数据表的类型2.6 修改数据表 3. MySQL 数据管理…...

解释 TypeScript 中的类型系统,如何定义和使用类型?

1. 类型系统的核心作用 TypeScript类型系统本质上是JavaScript的静态类型增强方案&#xff0c;提供三个核心价值&#xff1a; 开发阶段类型检查&#xff08;类似编译时eslint&#xff09;更清晰的API文档&#xff08;类型即文档&#xff09;更好的IDE自动补全支持 代码示例&…...

安裝do時出現log file support is not available

“log file support is not available (press RETURN)” 这个提示信息表明日志文件支持不可用&#xff0c;让你按回车键继续。出现这种情况可能是因为 Odoo 的日志相关配置存在问题或者一些必要的依赖没有正确安装配置。以下是一些可以尝试的解决办法&#xff1a; 1. 检查 Odo…...

[HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(1)知识基础

[HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(1)知识基础 水墨不写bug 文章目录 (一)概念梳理1.什么是协议?2.什么是应用层?3. 为什么要进行分层&#xff1f; &#xff08;二&#xff09;HTTP协议2.1 初识HTTP协议2.2HTTP协议的URL2.2.1域名2.2.2端口号2…...