记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

06-01 403阅读

一、问题描述

有个文件导入功能,用到了Hutool 的加密解密功能,本地运行完全可以,但是线上报错:“org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class cn.hutool.crypto.SmUtil.........”,如下图所示

记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

提示没有找到类NoClassDefFoundError,打开对应的JAR,查看class 是存在的,于是想到了JAR冲突,网上也有人说因为hutool-all 和hutool-core 两个包冲突,可是检查了我的项目,并没有pom 引入了hutool-core ???

难道是服务器的JAVA 环境问题? 于是本地打包后,启动项目,仍然报错,看来确实是因为maven 打包后导致的jar 冲突了,问题的关键点就是要找出冲突的jar 到底是哪个?

二、远程DEBUG

既然本地运行没有问题,只有打包后存在问题,那么就只能用到idea 的远程DEBUG 功能了 。

1、打开 IDEA,点击 Run > Edit Configurations。

2、点击左上角的 +,选择 Remote JVM Debug。

3、配置调试参数:

  • Name:配置名称(随意)。
  • Host:远程服务器的 IP 地址或域名。
  • Port:远程服务器 JVM 的调试端口(如 5005),与你项目启动端口不要一致
  • 注意一下JDK 要与线上环境一致

    点击 Apply 保存配置。

    记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

    4、把红框这段代码当做启动参数添加到线上环境启动脚本里

    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

    例如 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar  your-project.jar

    参数说明:

    • agentlib:jdwp:启用 JDWP 协议。
    • transport=dt_socket:使用 Socket 进行通信。
    • server=y:将当前 JVM 配置为调试服务器,等待调试客户端连接。
    • suspend=n:JVM 是否在启动时挂起,n 表示不挂起,y 表示挂起直到客户端连接。
    • address=*:5005:指定调试监听的端口。*:5005表示监听所有IP地址的5005端口,也可以指定监听xxx.xxx.xxx.xxx:5005

      5、启动远程的线上项目后,记得本地idea 也启动监听

      记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

      6、在报错的代码出打上断点,这时候访问远程的线上接口,断点会自动打进idea了

      记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

      我的问题就是代码53行报错,这时候选中 SmUtil.sm2(privateKey, null);idea快捷键alt+F8

      记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

      可见错误信息为:

      class "org.bouncycastle.asn1.ASN1Encodable"'s signer information does not match signer information of other classes in the same package

      现在找到了错误就是ASN1Encodable这个问题,在idea 里面双击shift ,搜寻这个类都存在哪些包里

      记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

      好吧,浮出水面了,有两个版本分别是bcprov-jdk14-138.jar 和 bcprov-jdk18on-1.73.jar

      于是我手动在打包好的 lib 目录里面删除了较低版本bcprov-jdk14-138.jar  ,项目重启,运行,测试通过

      三、查看依赖关系,从项目上解决

      方法一: 上面已经找到冲突的jar 了,接下来要找到究竟是在项目哪些jar 间接引用了这个bcprov-jdk14-138.jar,因为pom 里面搜不到

      这里我们可以使用idea插件中的依赖分析插件,来帮助我们寻找冲突的jar包

      记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

      成功下载后,找到我们的pom 文件,进行分析,如下图

      记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

      由此定位到了是core-renderer 这个包引用了bcprov-jdk14-138.jar ,确定这个类没有被实际使用,直接排除就好了

      记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

      方法二:如果不想下载插件,也可以用idea 自带的maven分析视图,注意要在下面选中对应pom

      记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

      找到后,如需删除直接选中右键,直接exclude 就好,会直接在pom 文件里面自动添加一下这段

           
               bcprov-jdk14
               bouncycastle
           
       

      记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码