最近项目的各类jar包依赖版本都进行了升级,然后测试环境出现一个很诡异的问题,所以记录一下排查过程。
问题出现
在某些部署完成后,使用了hutool的DigestUtil类的相关接口会报错,错误如下:
java.lang.NoClassDefFoundError:Could not initialize class cn.hutool.crypto.GlobalBouncyCastleProvider
java.lang.NoClassDefFoundError
然后从这个错误开始排查,发现这个包里的确有这个类,通过查询资料,猜测是静态变量加载失败,但是不明白为什么会失败。然后经过一系列查询和验证,有篇文章说NoClassDefFoundError经常伴随ExceptionInInitializerError异常。
java.lang.ExceptionInInitializerError
然后在另一个环境,部署完成后,发现第一次调用和第二次调用抛出的异常不一样,第一次抛异常是ExceptionInInitializerError,第二次开始才会抛出NoClassDefFoundError,并且找到了一篇相关介绍文章:怎么解决java.lang.NoClassDefFoundError错误
然后看到这里脑子短路了,虽然现在的确知道是因为初始化失败了,但是为啥呢?
signer information does not match signer information of other classes in the same package
继续观察我的错误日志,没有头绪的时候突然福至心灵,一般错误都会有错误原因啊,继续往下翻ExceptionInInitializerError下面的另一个caused by果然明晃晃写着原因:
Caused by: java.lang.SecurityException: class "org.bouncycastle.jcajce.provider.symmetric.IDEA$Mappings"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(ClassLoader.java:955) ~[na:1.7.0_191]
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:669) ~[na:1.7.0_191]
at java.lang.ClassLoader.defineClass(ClassLoader.java:797) ~[na:1.7.0_191]
好的,有方向就可以继续查,然后查到这个报错是因为:
SecurityException
然后去程序里查看,果然有两个版本的bouncycastle存在,排除掉其中一个。问题解决
参考
深入JVM分析spring-boot应用hibernate-validator NoClassDefFoundError