记一次---java.lang.NoClassDefFoundError 异常 排错

起因

因为系统要对接第三方系统,所以在系统中修改了相关的代码,然而神奇的是,本地启动时无异常,当访问登录界面时也无异常,但是升级测试环境linux的时候,启动无异常,一旦进行登入操作则会爆出了这样的一个异常:
显然这是一个运行时异常,在编译器并没有错误。因为在登录的时候调用了这个类SingletonThreadPool。

Caused by: java.lang.NoClassDefFoundError: com/xxx/schedule/base/util/SingletonThreadPool$SingletonContainer

排错思路

遇到这个错的第一反应就是去百度搜了一下,发现有很多人都有过这种错误,看到最多的就是都是类似这篇帖子的总结
http://blog.csdn.net/u011200604/article/details/51956654,然而读了也没有解决。

异常java.lang.NoClassDefFoundError,看清楚。

从日志的解决思路出发。。首先看Caused by: java.lang.NoClassDefFoundError:com/xxx/schedule/base/util/SingletonThreadPool$SingletonContainer,它说的是SingletonThreadPool$SingletonContainer,找不到定义得类,而这个类的命名SingletonThreadPool$SingletonContainer,这个命名规则熟悉内部类的同学一定知道,没错,它是一个在SingletonThreadPool中声明为SingletonContainer的内部类。这也是为什么没有在编译器报错的原因,正因为是引用了内部类,才导致在运行时会抛出这样的异常。

于是顺着上面的思路去查看了相关服务器下class对应的包下文件,发现确实没有SingletonThreadPool$SingletonContainer.class这个文件,到这里恍然大悟,因为打jar包的升级时候,忽略了内部类的存在,所以没有将相应的内部类.class文件打进jar包,导致最终的 java.lang.NoClassDefFoundError。

解决方案

将内部类的class文件加载也升级到对应的目录即可解决错误。说到底确实还是因为类没有被找到罢了….

猜你喜欢

转载自blog.csdn.net/s740556472/article/details/79551626