同一个分支maven构建出来的包不一样?

news2024/11/15 19:40:45

现象

最近发布spring boot项目时遇到了一个奇怪的问题,日志异常信息如下:

Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.SimpleLoggerFactory loaded from jar:file:/xxxxx/xxxxx.jar!/BOOT-INF/lib/slf4j-simple-1.7.30.jar!/). If you are using WebLogic you will need to add ‘org.slf4j’ to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.SimpleLoggerFactory

意思是检测到项目里面有多个slf4j-api的实现,因为我的项目里面使用logback作为我的日志库,所以造成了冲突。

问题

这个问题是这两天刚出现的,但事实上我并没有使用slf4j-simple,并且本地debug的时候也没有该报错。所以我的目标是找到这个slf4j-simple来自哪里。

排查思路一:分析pom依赖

我的第一步是打开项目的pom文件,借助idea的maven-helper插件,对整个项目的依赖库进行了过滤,但是并没有找到这个类库。

在这里插入图片描述

排查思路二:解压jar包

随后我根据报错的提示file:/xxxxx/xxxxx.jar!/BOOT-INF/lib/slf4j-simple-1.7.30.jar!,将流水线构建的jar包下载并解压,确实在这个路径下看到了这个jar包。于是我又给本地项目打了一个胖包,解压后发现,同样的路径下并没有这个jar文件。

在这里插入图片描述

排查思路三:更新本地仓库

既然本地没有找到,那么可能本地的maven仓库不是最新的,于是我把本地的maven仓库做了重命名,然后重新打开工程文件,让maven重新从远程仓库下载。

花了大约十分钟,maven依赖终于下载完毕。这一次我直接在maven本地仓库的文件夹下面查找,发现压根没有下载这个文件。

奇迹出现

就在我百思不得其解之际,我看到同事在流水线上使用同样的分支又构建了一次,并且发布成功了。这下惊掉了我的下巴,赶忙把它构建的jar包下载下来进行对比,一看它的jar包里面确实不存在slf4j-simple-1.7.30.jar。

左边是我构建的jar包,右边是他构建的。

寻求帮助

抱着这个疑问,我咨询了负责流水线的运维同学,最后在他们的不懈努力下,发现了问题。运维同学先是把所有依赖的jar包都解压,然后直接搜关键字,最后在其中一个sdk里面,发现了slf4j-simple-1.7.30.jar,但已经是被注释的状态。
在这里插入图片描述

真相大白

后面我咨询了同事,原来是他这两天在开发sdk时,不小心引入了这个类库,在发现问题之后,又将其注释了,但是前后的两个版本号都是同一个。并且修复的时间,恰好就在我排查问题的这个时间内。

这确实是个大坑。

正好解释了为什么这个问题是这两天才出现的,因为他前两天刚刚引入了这个类库并且在不修改sdk版本号的情况下将其上传到远程maven仓库,所以当我们进行发布的时候,就出现问题了。而我本地由于已经存在相同版本号的sdk,所以并不会更新代码,本地运行也就不会报错。

而就在刚刚他修复完sdk后,再一次用相同版本号进行了上传,此时我刚好在执行第三步的排查,更新本地的maven仓库,所以依旧没有找到破绽,因为问题实际上已经修复了。这个时候他再进行分支构建,就打出了没有问题的jar包了。

结论

本次问题的根本原因是同事修改pom代码但不修改SDK版本号就直接上传远程仓库,这种行为在实际开发中其实并不少见,有时候开发者觉得代码修改量不多、影响不大或者不愿意有问题的jar包被上传到远程仓库上,从而选择直接覆盖。假如这个时候你的同事刚好在排查问题,可能对他来说就是灾难。最后,希望这篇文章能够对大家排查类似问题提供思路。

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

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

相关文章

Image Watch 的使用

目录 1、下载地址 2、安装完成 3、调试 1、下载地址 Image Watch - Visual Studio Marketplace 2、安装完成 打开VS,在项目->其他窗口中有image watch选项 3、调试 一直放大图像可以查看详细的色彩值,通道数为3

各省绿色创新效率原始数据+测算(2020-2021)

采用了考虑非期望产出的超效率SBM模型来测量中国各省的绿色创新效率。该数据包括原始数据测算结果,包括人力资本、资本、能源投入,以及技术、经济、生态效益等多个维度的数据。可以帮助研究人员了解中国各省的绿色创新效率情况,揭示不同省份在…

搜索引擎概念解析

搜索引擎概念解析 什么是搜索引擎 MySQL搜索引擎举例 搜索引擎是一种用于在互联网上搜索并呈现相关信息的工具。它通过自动扫描和索引大量网页内容,并根据用户提供的关键词或查询条件,返回与之相关的网页链接和摘要。 当用户在搜索引擎中输入关键词或…

系列二、RocketMQ基本概念 系统架构

一、基本概念 1.1、消息(Message) 消息是指,消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须输入一个主题。 1.2、主题(Topic) Topic表示一类消息的集合,每个…

筑牢三大新型能源基础设施,能源变革的分水岭和路线图

当下面临百年未有之大变局,创新科技密集发生,面对瞬息万变的世界,寻找到一条通往未来的确定性道路,绝对是行稳致远的前置条件。 “双碳战略”持续推进,距离2030“碳达峰”越来越近,能源产业变革的重要性和迫…

【SpringMVC 学习笔记】

SpringMVC 笔记记录 1. SpringMVC 简介2. 入门案例3. 基本配置3.1 xml形式配置3.2 注解形式配置 4. 请求4.1 请求参数4.1.1 普通类型传参4.1.2 实体类类型传参4.1.3 数组和集合类型传参 4.2 类型转换器4.3 请求映射 5. 响应 1. SpringMVC 简介 三层架构 2. 入门案例 3. 基本…

如何建立自己的知识体系?202209

知识太多了,无法全部快速吸收进大脑,需要通过特定的方法、技能,在面对大量知识的情况下,快速梳理,构建自己的知识体系。 学习的目标,不仅仅是记忆知识,而是搜索知识、并过滤、洞察、理解、使用…

Spring Boot 整合视图层技术 Thymeleaf

大家好!我是今越。简单记录一下在 Spring Boot 框架中如何整合 Thymeleaf 及使用。 Thymeleaf 简介 Thymeleaf 是新一代 Java 模板引擎,它类似于 Velocity、FreeMarker 等传统 Java 模板引擎,但是与传统 Java 模板引擎不同的是,T…

爆肝整理,App测试小技巧,全覆盖功能到性能测试...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 app测试是使用手动…

ES查询[全网最全免费送付费内容]

ES查询 相关度搜索,需要计算评分 _score 相关度评分用于对搜索结果排序,评分越高则认为其结果和搜索的预期值相关度越高,即越符合搜索预期值。在7.x之前相关度评分默认使用TF/IDF算法计算而来,7.x之后默认为BM25。 源数据&…

Win 10 重装系统(PE方式)

前言: 最近这个笔记本(ThinkPad E480,使用了四年左右)用起来很卡,经常开机状态时,合上之后,再打开屏幕就卡死了,鼠标和键盘按了都没有反应,无奈之下只能强制按电源关机后…

SpringCloud——Nacos下载

文章目录 nacos简介nacos下载nacos的启动访问nacos nacos简介 Nacos(全称为 “Naming and Configuration Service”)是阿里巴巴开源的一个用于实现动态服务发现、服务配置和服务元数据管理的项目。它是一个分布式系统的服务基础设施,为云原生…

turtle画春联

import turtle #右边春联 turtle.penup() turtle.goto(100,150) turtle.pendown() turtle.color(red,red) turtle.begin_fill() turtle.forward(50) turtle.right(90) turtle.forward(400) turtle.right(90) turtle.forward(50) turtle.right(90) turtle.forward(400) turtle.e…

【大数据Hive】Hive 窗口函数使用详解

目录 一、前言 二、hive 窗口函数概述 2.1 聚合函数与窗口函数差别 2.1.1 创建一张表 2.1.2 加载数据到表中 2.1.3 sumgroup by普通常规聚合操作 2.1.4 sum窗口函数聚合操作 三、窗口函数 3.1 窗口函数语法 3.2 参数说明 3.2.1 Function(arg1,..., argn) 3.2.2 OV…

ElasticSearch 索引设计

ElasticSearch 索引设计 在MySQL中数据库设计非常重要,同样在ES中数据库设计也是非常重要的 概述 创建索引就像创建表结构一样,必须非常慎重的,索引如果创建不好后面会出现各种各样的问题 索引设计的重要性 索引创建后,索引的分片…

找工作第二弹——挑战CSS重难点一篇就够

目录 前言CSS知识点篇1. 选择器2. CSS三大特性三大特性计算权重 3. 显示模式显示模式转化 4. 解决高度塌陷问题5. 浮动浮动介绍为什么要清除浮动-解决高度塌陷问题清除浮动额外标签法(W3C推荐做法)给父亲添加overflow伪元素法双伪元素 6. BFC7. 定位子绝…

辉哥带你学hive第八讲

1.自定义函数 1.1 自定义函数类型 根据用户自定义函数类别分为以下三种: (1)UDF(User-Defined-Function) 一进一出。 (2)UDAF(User-Defined Aggregation Function) 用户…

【二叉树part08】| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 🎈LeetCode235.二叉搜索树的最近公共祖先 🎈LeetCode701.二叉搜索树中的插入操作 🎈LeetCode450.删除二叉搜索树中的节点 🎈LeetCode235.二叉搜索树的最近公共祖先 链接:235.二叉搜索树的最近公共祖先 给定一个…

Maven(三)如何使用命令导出所有的组件和版本信息

命令如下: mvn dependency:tree | grep ":jar" | sed s/ //g | sed s/-//g | sed s/\\-//g | sed s/|//g | awk !x[$0]注意:以上命令需要在 Git Bash 中执行。 执行结果: 整理完毕,完结撒花~ 🌻

Background-2 盲注的讲解基础概述二

文章目录 一、基于报错的 SQL 盲注------构造 payload 让信息通过错误提示回显出来二、基于时间的 SQL 盲注----------延时注入总结 一、基于报错的 SQL 盲注------构造 payload 让信息通过错误提示回显出来 select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,fl…