解决NoSuchlMethodError: org. bouncycastle, asnl. x9. x9IntegerConver.getByteLength(Lcom/xmsme/national/secrets/math/ec/ECFieldElement

Caused by: java.lang.NoSuchMethodError: org.bouncycastle.asn1.x9.X9IntegerConverter.getByteLength(Lcom/xmsme/national/secrets/math/ec/ECFieldElement;)I
    at com.xmsme.national.secrets.math.ec.ECPoint$Fp.getEncoded(ECPoint.java:203)
    at com.xmsme.national.secrets.SM2Utils.encrypt(SM2Utils.java:73)
    

项目启动时偶尔报上面的错误,经过分析是第三方给的national.secrets-2.0.0.jar包与我们工程中的bcprov-jdk15on-1.68.jar 包中都有 org.bouncycastle.asn1.x9.X9IntegerConverter类,导致冲突

A.jar == national.secrets-2.0.0.jar

B.jar == bcprov-jdk15on-1.68.jar 

经过分析, X9IntegerConverter类在 两个jar包中包名和类名称都相同,在springboot启动时只能加载一个,加载第二个时检查该类已经加载(类加载是以包名称和类名所有唯一标识),就不会再次加载,某个业务本来想调用A.jar中的X9IntegerConverter.getByteLength,但有时实际是加载了b.jar中的X9IntegerConverter,在调用时发现是b.jar中的.getByteLength方法,入参类型不匹配就报错了,那如何解决呢,经过一顿搜索,最终将national.secrets-2.0.0.jar从打的jar包中去除(去除配置自行搜索),并在项目jar包同级下创建lib目录,将national.secrets-2.0.0.jar放入lib,在启动脚本中加入jvm参数 -Dloader.path=lib,问题解决

 

关于-Dloader.path=lib生效条件参考链接https://www.cnblogs.com/youxin/p/17380438.html

posted @ 2025-05-29 11:17  北极白开水  阅读(145)  评论(0)    收藏  举报