这是一次炒冷饭的工作. 都不知道这是第几次遇到了. 在记录一波…
先把以前的文档抬上来. hmmmm

背景

下午1点半,业务反馈容器的加载有问题,不加载LIB jar包,导致业务无法正常进行.

处理

由于这是一个很重要的业务,我第一时间先通过SSH进入容器查看当时进程的加载情况
image.png
从截图上,进程都加载jar包. 跟描述的好像不太对.
随后,业务反馈让我使用 jad xxx.xxx.xxx 看一些某个类. 发现并没有
image.png
但是使用 classloader -c --load xx.xx.xxx 还是可以的.

随后又爆出本篇主角 java.lang.NoClassDefFoundError: Could not initialize class com.xxx.xxx.services.youzan.basis.YouzanClientHelperNew
image.png
到这步还是比较明显的. 其实就是初始化 YouzanClientHelperNew 的时候,静态代码块或者静态字段出现了错误,JVM会标记这个类失败了,后续使用的时候就会出现这个错误. 如果没有经验的话,就会去找这个类,发现这个类有存在的误区,导致找不到问题之所在.
image.png
异常类截图.
image.png
如何修正

  • 静态代码快加 try catch ,错误抛出或者是日志明显的打印. 这种错误必须看到最原始的错误,否则就会被这种NoClassDefFoundError淹没.
  • 如果没有静态代码块,那么必然是静态字段初始化错误,可将静态字段放置在代码块中实例话,并 try catch .

最后爆出来的问题
image.png

总结

这个问题基本上没有啥可讲的,有经验的基本上5分钟可以FIX,如果不知道就会陷入类加载的巨大浪潮中. 明明有这个类怎么会没找到呢. hmmmm

必看链接

其实我还碰到一回,
nested exception is java.lang.NoClassDefFoundError: Cloud not initialize class sun.security.provider.certpath.AlgorithmChecker. 这个就更加玄学,在ECS上没有报错,但是在容器中就报错了,最后的解决方案是提前初始化Thread类,至今不知道为啥.
image.png