NoClassDefFoundError问题排查

简介: NoClassDefFoundError问题排查

1. 问题描述

首先贴出错误:

本地跑是没有报错的,打包后运行就报错了。

2. 问题排查

可以看到是没有依赖到CatalogFactory,全局搜索,可以看到该类在flink-table-common-1.13.6.jar这个包。

3. 问题解决

3.1 解决方案1-添加依赖

查看pom文件,看看有没有依赖,如果没有,添加该依赖。

注意:一般到这里就可以解决NoClassDefFoundError这个错误了,下面来看看特殊的情况。

3.2 解决方案2-修复代码

如果依赖了,打包后,运行时还有此错误,就需要解压Jar包,看看/BOOT-INF/lib目录,有依赖没有此jar包,如果没有,就是打包有问题了。

如果有,依然提示此问题,则可能是代码问题了。


我们看看代码,代码片段如下:

// 使用URLClassLoader加载本地的jar包
URL url = new File("/temp/test.jar").toURI().toURL();
URLClassLoader classLoader = new URLClassLoader(new URL[]{url});
// 下面是ClassLoader的操作
......

注意:上面是使用URLClassLoader只是加载了test.jar里面的内容,Jar包里面是没有CatalogFactory,所以就报这个错误了!

该如何解决呢?可以使用URLClassLoader里面的 “继承”,就是该URLClassLoader继承当前环境的ClassLoader即可,改写完如下:

URL url = new File(jarLocalUrls).toURI().toURL();
URLClassLoader classLoader = new URLClassLoader(
  new URL[]{url}, 
  Thread.currentThread().getContextClassLoader()
);

最后,问题就解决了。

4. 排查的方法记录

4.1 查找jar包是否存在、引用某个类的命令

find ./ -name “*.jar” | xargs grep “xxx”

4.2 查看加载了什么类

java -verbose -jar data-rtc-manage-1.0.0.jar

4.3 Jar包启动流程

参考:《SpringBoot可执行jar包启动原理》

5. 文末

本文记录下这个bug,希望能帮助到大家,谢谢大家的阅读!

目录
相关文章
|
3月前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到内存不足时会抛出OutOfMemoryError(OOM)异常。常见OOM情况包括:1) **Java堆空间不足**:大量对象未被及时回收或内存泄漏;2) **线程栈空间不足**:递归过深或大量线程创建;3) **方法区溢出**:类信息过多,如CGLib代理类生成过多;4) **本机内存不足**:JNI调用消耗大量内存;5) **GC造成的内存不足**:频繁GC但效果不佳。解决方法包括调整JVM参数(如-Xmx、-Xss)、优化代码及使用高效垃圾回收器。
146 15
常见java OOM异常分析排查思路分析
|
5月前
|
监控 Java
Java中的内存泄漏分析与排查技巧
Java中的内存泄漏分析与排查技巧
|
2月前
|
IDE Java 测试技术
如何避免`NoClassDefFoundError`问题的发生?
`NoClassDefFoundError`是Java中常见的错误,通常发生在JVM在类路径中找不到特定类的定义时。要避免此类错误,确保所有依赖项正确添加到项目中,使用构建工具如Maven或Gradle管理依赖,检查类路径配置,避免版本冲突,并确保应用程序和库的兼容性。
|
5月前
|
Prometheus 监控 Cloud Native
Java 服务挂掉,服务器异常宕机问题排查
Java 服务挂掉,服务器异常宕机问题排查
876 1
|
7月前
|
监控 网络协议 NoSQL
java线上排查OOM内存溢出
java线上排查OOM内存溢出
247 1
|
监控 Java
jvm异常排查
jvm异常排查
52 0
|
Arthas Java 测试技术
Arthas 排查JVM问题总结
Arthas 排查JVM问题总结
435 0
Arthas 排查JVM问题总结
|
缓存 算法 Java
JVM问题排查
JVM问题排查
190 0
|
缓存 Java 数据库连接
JAVA-定位排查bug
JAVA-定位排查bug
123 0
|
SQL 存储 Java
【问题处理】—— 一次内存溢出(OutOfMemoryError)实战排查
【问题处理】—— 一次内存溢出(OutOfMemoryError)实战排查
297 0