【总结】记一次log4j包冲突引发es类找不到的问题

2023-05-16

问题现象

某天,某个应用搞新的迭代,突然报ElasticSearch 7.17.5 相关操作都失败了,且问题是必现,本地启动也能稳定复现。组内小伙伴按照es jar包冲突排查了一番,无果,于是问题转交给我来排查。

错误信息是:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.elasticsearch.client.RestHighLevelClient
	at cn.tss.yun.common.util.es.restclient.ElasticSearchRestClient.restHighLevelClient(ElasticSearchRestClient.java:128)
	at cn.tss.yun.common.util.es.restclient.ElasticSearchRestClient.<init>(ElasticSearchRestClient.java:78)
	at cn.tss.yun.common.util.es.restclient.ElasticSearchRestClientFactory.getEsRestClient(ElasticSearchRestClientFactory.java:65)
	at cn.tss.yun.tech.component.biz.service.impl.ElasticSearchService.getElasticSearchRestClient(ElasticSearchService.java:48)

排查分析

刚开始看到错误信息,注意,此处是NoClassDefFoundError,表明类是存在的,但是初始化时出错。如果是真的class文件都找不到,应该是报ClassNotFoundException.

我也按照ES jar包冲突的方向排查。一通解压反编译,排查下来,ES的相关的类和包,都没有版本冲突问题,和代码中使用的包路径,构造方法等,都是吻合的,但这里怪异的是,在其他应用中ES是正常使用的。

经过两次启动调试,笔者发现一个规律。应用在启动时,第一次访问ES相关接口,会先输出这么一段错误信息:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.LogManager
at org.elasticsearch.client.RestHighLevelClient.(RestHighLevelClient.java:261)

于是瞬间,将焦点聚集在Log4j上。根据之前多次遇到类似的问题,这里很明显是log4j和logback的冲突。

进一步点开pom依赖证实,发现应用比其他应用多了:log4j-core、log4j-slf4j-impl 两个包。

瞬间豁然。表象上看是ES的RestHighLevelClient 类不存在,但是该类之所以不存在是因为,JVM第一次加载RestHighLevelClient class到内存中来时,由于class也要有初始化动作,该类有一个private static 的logger属性需要初始化,由于log4j和logback的冲突,导致该变量无法初始化,进一步导致RestHighLevelClient class 无法被加载成功。

line 261:private static final Logger logger = LogManager.getLogger(RestHighLevelClient.class);

程序上第二次、第三次、第N次访问接口时,报错就只报
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.elasticsearch.client.RestHighLevelClient
让人误以为是ES包冲突。

解决该问题,必须要对jvm 类加载机制有一定了解。

总结

直接原因

程序执行时创建ES 连接RestHighLevelClient 时,报该类不存在。

根本原因

hive-jdbc 升级版本到2.3.3后,间接依赖的log4j-core、log4j-slf4j-impl两个包和logback 的包有冲突。将引入log4j-core、log4j-slf4j-impl两个jar包排掉就可以了。

  • 真正错误原因分析

关键错误信息:

	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.LogManager
	at org.elasticsearch.client.RestHighLevelClient.<clinit>(RestHighLevelClient.java:261)
	at cn.tss.yun.common.util.es.restclient.ElasticSearchRestClient.restHighLevelClient(ElasticSearchRestClient.java:128)
	at cn.tss.yun.common.util.es.restclient.ElasticSearchRestClient.<init>(ElasticSearchRestClient.java:78)

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.LogManager
at org.elasticsearch.client.RestHighLevelClient.(RestHighLevelClient.java:261)
这段核心错误的关键在于at org.elasticsearch.client.RestHighLevelClient.
clint是指jvm加载类初始化时,发生的错误。

JVM第一次加载RestHighLevelClient class到内存中来时,由于class初始化动作需要初始化static变量,该类有一个private static 的logger属性需要初始化,由于log4j和logback的冲突,导致该变量无法初始化,进一步导致RestHighLevelClient class 无法被加载成功。

  • 源码截图
    在这里插入图片描述

解决方法

排除冲突的log4j-core、log4j-slf4j-impl两个jar包

 <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-framework</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-recipes</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>*</artifactId>
                    <groupId>com.sun.jersey</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>log4j-core</artifactId>
                    <groupId>org.apache.logging.log4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>log4j-slf4j-impl</artifactId>
                    <groupId>org.apache.logging.log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【总结】记一次log4j包冲突引发es类找不到的问题 的相关文章

  • 在kali2021.2系统下登录Windows server 远程桌面和安装搜狗拼音输入法

    1 安装 rdesktop apt update apt install rdesktop 2 开启 Windows server 远程协助服务 xff0c 同时还要将高级设置中的 网络级别身份验证取消 xff0c 否则会出现无法连接的提示
  • 随机排列算法及《算法导论》5.3节习题解答

    随机排列算法及 算法导论 5 3节习题解答 算法导论 介绍了两种随机排列数组的算法 第一种算法是为数组的每个元素A i 赋一个随机的优先级P i xff0c 然后依据优先级对数组A中的元素进行排序 例如 xff0c 如果初始数组A 61 1
  • 一个F范数对矩阵求导例子

    61 61 PART1 61 61 1 问题 如何求下列表达式中的未知参数W xff1f 求偏导 xff1f min f
  • Ubuntu设置sudo免密码

    步骤1 xff1a 使用su命令切换至root用户 在终端中输入以下命令 xff1a sudo su 输入当前用户的密码 xff0c 即可切换至root用户 步骤2 xff1a 使用如下命令修改sudoers文件权限 在终端中输入以下命令
  • log4j2 使用详解

    转载自 Blog of 天外的星星 xff1a http www cnblogs com leo lsw p log4j2tutorial html Log4j 2的好处就不和大家说了 xff0c 如果你搜了2 xff0c 说明你对他已经有
  • 基于webpack实现多html页面开发框架八 html引入图片打包和公共页面模块复用

    一 解决什么问题 1 html中img引入的图片地址没有被替换 xff0c 找不到图片 2 html公共部分复用问题 xff0c 如头部 底部 浮动层等 二 html中img引入图片问题解决 1 在index html插入img xff0c
  • 程序员入门编程,看这10本书,少走10年弯路

    如果能时光倒流 xff0c 回到过去 xff0c 作为一个开发人员 xff0c 你可以告诉自己在职业生涯初期应该读一本 xff0c 你会选择哪本书呢 xff1f 我希望这个书单列表内容丰富 xff0c 可以涵盖很多东西 高尔基曾说 书是人类
  • 编译vs2008的samples程序总是跳过

    编译vs2008的samples程序总是跳过 xff0c 要配置属性还显示 未能完成操作 未指定的错误 的解决办法 作者 admin 分类 开发问题 发布时间 2013 03 12 09 22 974 浏览数 6 没有评论 文章转自王牌软件
  • 二叉排序树的删除

    xff08 网上讲二叉排序树删除的资料很少 xff0c 这篇很不错 xff01 转自 xff1a http bbs csdn net topics 110010437 xff09 二叉排序树的删除 xff1a 对于一般的二叉树来说 xff0
  • MFC 用户界面线程:界面线程的退出 窗口关闭的流程

    原文链接 xff1a http wenku baidu com link url 61 6CFkWbLOeFgNoUsJniCX3ksw6 RztxMr9Z e6t7uu3e vV7UTKThUEkyRkq8IXwxIw5qYctN8gIx
  • MFC用户界面多线程实例2

    以下是 MFC 用户界面线程相关知识 由于用户界面线程含有自己的消息循环 xff0c 可以出来 Windows 消息 xff0c 并可创建和管理诸如窗口和控件等用户界面 元素 因此 xff0c 这 种线程较工程线程更为复杂 创建用户界面线程
  • 反汇编定位代码崩溃位置_1

    原帖 xff1a http blog csdn net gwzz1228 article details 9045853 利用map xff0c cod文件定位崩溃代码行 利用vs2010 新建一个空的控制台项目 xff0c 添加文件gtg
  • 反汇编定位代码崩溃位置_3

    原帖 xff1a http blog sina com cn s blog 141f234870102van8 html win7 43 vs2010通过map文件和cod文件找到崩溃的代码行 2015 01 11 11 31 04 转载
  • 反汇编定位代码崩溃位置_4

    原帖 xff1a http blog csdn net xiao article details 23177577 GDB如何从Coredump文件恢复动态库信息 标签 xff1a GDBcoredumpso调试动态库 2014 04 08
  • C链表反转

    节点 struct Note int value Note pNext typedef struct Note PList 生成一个链表 Note GenerateList 输出一个链表 void PrintList Note pHead
  • FtpClient.storeFile返回false解决方法

    今天在利用FTP将客户端文件存储到服务器端时 xff0c 在调用ftpClient storeFile方法后 xff0c 总是返回false xff0c 在百度之后 xff0c 有提到说添加一行 ftpClient enterLocalPa
  • 压缩软件介绍

    压缩软件介绍 一 xff0e 关于WINRAR压缩 ZIP 1 最大优点就是普及率 2 相对RAR格式来说它的压缩速度会要快一些 RAR 1 对比ZIP来说RAR是一次长足的进步 它能够提供更好的压缩比率 2 支持固实压缩模式 对存在很多重
  • ubuntu 使用MobaXterm和cpolar配置外网访问ssh和vnc

    目录 1 首先下载MobaXterm xff1a mobaxterm 2 注册并在ubuntu服务器上安装cpolar xff1a cpolar 安装说明 xff1a 3 保留固定TCP地址 xff08 此步骤可跳过 xff0c 但需要每天
  • copy-webpack-plugin HookWebpackError: Not supported

    前言 运行项目时 xff0c 控制台报错 HookWebpackError Not supported 定位问题发现与 copy webpack plugin 相关 本文主要记录下解决方案 一 控制台报错 二 copy webpack pl
  • 字符串子串的查找

    1 考虑用标准函数库中 strstr 函数 包含文件 xff1a string h 函数名 strstr 函数原型 xff1a extern char strstr char str1 char str2 功能 xff1a 从字符串str1

随机推荐