您当前的位置: 首页 > 

杨林伟

暂无认证

  • 3浏览

    0关注

    3337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

NoClassDefFoundError问题排查

杨林伟 发布时间:2022-08-13 18:01:05 ,浏览量:3

文章目录
    • 1. 问题描述
    • 2. 问题排查
    • 3. 问题解决
      • 3.1 解决方案1-添加依赖
      • 3.2 解决方案2-修复代码
    • 4. 排查的方法记录
      • 4.1 查找jar包是否存在、引用某个类的命令
      • 4.2 查看加载了什么类
      • 4.3 Jar包启动流程
    • 5. 文末

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,希望能帮助到大家,谢谢大家的阅读!

关注
打赏
1662376985
查看更多评论
立即登录/注册

微信扫码登录

0.0800s