一、背景:在做一次应用更新发布的时候,应用发布完成,但是请求访问的时候报了NoClassDefFoundError异常,出现了如下错误:
二、问题猜测及分析:
1、项目打包有问题或者打包不完整,导致缺少类文件,所以初始化加载失败:重新打包,并在本地验证没问题。但是更新到服务器以后,依然存在同样的问题。❌
2、通过“NoClassDefFoundError”关键字对日志文件进行筛查,发现存在其他异常信息,具体如下:
部分代码如下:
注意⚠️:
- 此处是Kotlin语言,companion object包裹的内容类似于Java中static
- BankInterfaceUtils位于独立的jar包中,与PaymentTaskModel不在同一个jar包中
原因解析:IOC容器获取BankInterfaceUtils对象,但是由于本地的BankInterfaceUtils工具类的jar版本和服务器上面的jar版本不一致,所以加载实例失败,导致PaymentTaskModel无法访问(任何使用PaymentTaskModel的地方都会出现“NoClassDefFoundError”异常)
解决方法:更改服务器上面jar包的版本,使其与本地环境的版本一致
3、问题拓展:也可能是由于静态变量或静态块引起的异常,详细可参考:java.lang.NoClassDefFoundError: Could not initialize class xxx 原因及解决方法_轻松囧的博客-CSDN博客
三、总结:
遇到此类问题,可通过如下思路进行分析:
1、通过关键字“NoClassDefFoundError”或者“ExceptionInInitializerError”对日志进行筛查,找出问题的根源点。根据第一次加载时的错误日志,对代码进行核查分析。
2、检查本地环境与服务器环境所使用的外部jar包版本是否一致