文章目录
1. 问题描述
- 1. 问题描述
- 2. 问题排查
- 3. 问题解决
- 3.1 解决方案1-添加依赖
- 3.2 解决方案2-修复代码
- 4. 排查的方法记录
- 4.1 查找jar包是否存在、引用某个类的命令
- 4.2 查看加载了什么类
- 4.3 Jar包启动流程
- 5. 文末
首先贴出错误: 本地跑是没有报错的,打包后运行就报错了。
可以看到是没有依赖到CatalogFactory
,全局搜索,可以看到该类在flink-table-common-1.13.6.jar这个包。
查看pom文件,看看有没有依赖,如果没有,添加该依赖。 注意:一般到这里就可以解决NoClassDefFoundError这个错误了,下面来看看特殊的情况。
如果依赖了,打包后,运行时还有此错误,就需要解压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,希望能帮助到大家,谢谢大家的阅读!