背景:
由于从事银行金融系统,所以经常用到加密的东西,有一次使用到国密SM2的验签功能,在本地进行测试时完全没问题,发布到服务器上面后一直报 Hex 包中的decodeStrict方法不存在
排查:
使用到的jar包版本为 bcprov-jdk15on-1.68.jar,在服务器上面查看应用部署路径下是存在Hex.decodeStrict()方法的,但是就是一直报找不到该方法,
后来怀疑可能是存在jar包冲突,在应用路径下反复查看是否存在相同路径的类,然后都没有发现任何端倪。由于我们系统都是部署在weblogic下面的,所以又查看了weblogic目录下的module文件夹,一般weblogic的jar包都部署在该文件夹下,但是依然一无所获
由于java类加载器是按照双亲委派机制加载,先加载bootstrap(也就是jdk的jar包)下面的jar包,再加载ext下的扩展jar包,然后才是AppClassLoader,后续排查weblogic中环境变量设置和系统环境变量中加载的jar包路径,发现weblogic还去加载了oracle_common下的modules模块,终于在该模块下发现了低版本的bcprov-jdk15on jar包中的Hex类缺失了decodeStrict方法,因此报了该错误
解决:
将oracle_common下的bcprov-jdk15on jar包删除即可,让应用只加载bcprov-jdk15on-1.68.jar即可