记一次离奇的NoClassDefFoundError

一次非常误导人的NoClassDefFoundError

摘要

NoClassDefFoundError有时候未必如类名所示那样,运行时找不到某一个类。而可能会是某种八竿子打不着的奇葩原因所致:比如栈溢出StackOverFlow。

踩坑经历

接手一个老项目,碰到了一个离奇的问题:在使用Jenkins构建测试环境启动时经常会抛出一个奇怪的异常:

java.lang.NoClassDefFoundError: org.springframework.beans.FatalBeanException

详细截图:
在这里插入图片描述
由于本机启动正常,首先怀疑的是测试环境jar包冲突、或者jar包版本不对,以至于运行时没有加载到FatalBeanException这个类。

然而排查了许久,并使用了jvm参数-verbose来打印出所有类加载的信息,发现jar包并没有问题,FatalBeanException这个类也是正常加载进了jvm之中。所以,并不是jar包的问题。

我和我的小伙伴们的思路顿时走进了死胡同,百思不得其解。最终只好从源码入手,在抛出异常的地方打断点调试:

首先是最外层的异常:
在这里插入图片描述
点开ex一看堆栈是这样的:
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
在这里插入图片描述
定位到AutowiredAnnotationBeanPostProcessor.java:334打断点重新启动,发现是在此catch住了一个异常,并throw了一个BeanCreationException
在这里插入图片描述
点开此处catch的异常,长这样:
在这里插入图片描述
继续追溯至org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:661)
断点重启:
在这里插入图片描述
原来是个stackOverFlowError,真是fuck了。原因是这个项目太臃肿了,spring在启动时候加载大量的依赖,导致方法调用链过高,最终导致了栈溢出。

于是增大栈内存:-Xms1m,重启,问题解决。

结论

有时候,系统给的异常信息是会误导人的。此时就需要我们动用聪明的大脑,从源码入手,来找出问题的真正原因。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值