| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> Java知识库 -> bug记录: 本地idea运行没有问题,打包后出现ClassNotFoundException: org.apache.flink.util.OptionalFailure。 -> 正文阅读 |
|
|
[Java知识库]bug记录: 本地idea运行没有问题,打包后出现ClassNotFoundException: org.apache.flink.util.OptionalFailure。 |
问题背景最近在搞数据中台项目,用到了flink框架,在获取flink指标项的时候出现了异常. 异常调用代码
出现了类加载不到的异常
奇怪的是,本地运行没有任何问题,我们是springboot项目,打包运行后出现类找不到的异常。 解决思路: 追踪代码后,基本定位到是classloader加载的问题。于是在项目中增加测试用例。
结果发现,本地运行和springboot打包后,同一个类的classloader是不一样的,本地启动的classlaoder是sun.misc.Launcher$AppClassLoader。 但是执行java -jar启动后,类加载器是org.springframework.boot.loader.LaunchedURLClassLoader,这是因为spring项目自定义了classloader来加载文件。 那么他们两个是什么关系呢?
打包后,输出结果
可以看到,打包后,OptionalFailtureLoader的类加载器是springboot的classloader加载的,但是我们调用方法传递的是getSystemclassloader,--> sun.misc.Launcher$AppClassLoader,这样根据双亲委派机制,向上寻找肯定是找不到的。
修改方案
?在调用时传递classloader,将当前线程的classloader传递进去。根据上图,当前线程的classsloader是TomcatEmbeddedWebappClassLoader,父classloader是org.springframework.boot.loader.LaunchedURLClassLoader,而打包后,OptionalFailureLoader就是由org.springframework.boot.loader.LaunchedURLClassLoader加载的,双亲委派向上查找,就可以找到对应的java类。这样就可以解决问题。 |
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年12日历 | -2025/12/8 23:47:42- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |