这是一次炒冷饭的工作. 都不知道这是第几次遇到了. 在记录一波…
先把以前的文档抬上来. hmmmm
背景
下午1点半,业务反馈容器的加载有问题,不加载LIB jar包,导致业务无法正常进行.
处理
由于这是一个很重要的业务,我第一时间先通过SSH进入容器查看当时进程的加载情况
从截图上,进程都加载jar包. 跟描述的好像不太对.
随后,业务反馈让我使用 jad xxx.xxx.xxx
看一些某个类. 发现并没有
但是使用 classloader -c --load xx.xx.xxx
还是可以的.
随后又爆出本篇主角 java.lang.NoClassDefFoundError: Could not initialize class com.xxx.xxx.services.youzan.basis.YouzanClientHelperNew
到这步还是比较明显的. 其实就是初始化 YouzanClientHelperNew
的时候,静态代码块或者静态字段出现了错误,JVM会标记这个类失败了,后续使用的时候就会出现这个错误. 如果没有经验的话,就会去找这个类,发现这个类有存在的误区,导致找不到问题之所在.
异常类截图.
如何修正
- 静态代码快加
try catch
,错误抛出或者是日志明显的打印. 这种错误必须看到最原始的错误,否则就会被这种NoClassDefFoundError淹没. - 如果没有静态代码块,那么必然是静态字段初始化错误,可将静态字段放置在代码块中实例话,并
try catch
.
总结
这个问题基本上没有啥可讲的,有经验的基本上5分钟可以FIX,如果不知道就会陷入类加载的巨大浪潮中. 明明有这个类怎么会没找到呢. hmmmm
必看链接
其实我还碰到一回,nested exception is java.lang.NoClassDefFoundError: Cloud not initialize class sun.security.provider.certpath.AlgorithmChecker.
这个就更加玄学,在ECS上没有报错,但是在容器中就报错了,最后的解决方案是提前初始化Thread类,至今不知道为啥.