一次 JVM 类加载异常
创始人
2025-05-29 20:54:24

文章目录

    • 1. JVM 类加载异常
      • 1. 出现问题
      • 2. 解决过程
        • 1. JDK 7 版本过老
        • 2. JDK 8 小版本无关
        • 3. 缺少 SunEC version 1.8 加密包
        • 4. 强制添加加密包无效
        • 5. 找到 JVM 类加载问题
      • 3. 解决方案

1. JVM 类加载异常

1. 出现问题

  • 使用 HTTP 协议对接第三方服务,本地测试可以正常成功,测试环境连接第三方失败,项目使用的 maven 是 httpclient-4.5.1
  • 抛出的异常为
    Javax.net.ssl.SSLException: Received fatal alert: protocol_version
    Javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

2. 解决过程

1. JDK 7 版本过老

  • 通过异常得知 SSL 加密协议版本问题,查询第三方文档,得知仅支持 HTTPS 使用 TLS 1.2 加密方式
  • 排查发现本地使用 JDK 1.8.0_221,线上使用的是 JDK 7,通过搜索可知 JDK 7 调用第三方 HTTPS 接口、默认使用的是 TLS1 加密方式,而非 TLS 1.2 加密方式,JDK 1.8 默认 TLS 1.2
  • 细看 HTTP 调用工具类使用了 SSLContext.getInstance(“TLSv1.2”) 强制改变加密方式,但是依然异常,加 System.setProperty("javax.net.debug", "all"); 打印出网络调试日志,发现调用异常且还是使用的 TLS 1
    在这里插入图片描述

2. JDK 8 小版本无关

  • 改动业务到使用了 jdk1.8.0_131 的微服务上,仍有异常、但异常改变为
    Caused by: Java.security.NoSuchAlgorithmException: Cannot find any provider supporting DESede/CBC/PKCS5Padding
  • 仔细对比本地使用的是 jdk1.8.0_321,通过 Oracle 官方文档可知 8u211 相对 8u202 有较大更新,因此测试环境尝试升级 jdk1.8.0_131,还是相同异常,发现与小版本无关

3. 缺少 SunEC version 1.8 加密包

  • 根据异常,本地 debug 查到 Javax.crypto.Cipher 类,通过在线 JDK8 文档查到加密类型是 Java 平台均支持的(意思和本地使用 Mac,测试环境使用 Linux 无关),但确实在加密时无法获取 DESede/CBC/PKCS5Padding ,同时也尝试其他加密方式异常相同

在这里插入图片描述

  • 后续通过搜索查到添加:System.out.println(Arrays.toString(Security.getProviders())); 发现 Linux 环境缺少了 SunEC version 1.8 加密包
  • 本地 Mac:[SUN version 1.8, SunRsaSign version 1.8, SunEC version 1.8, SunJSSE version 1.8, SunJCE version 1.8, SunJGSS version 1.8, SunSASL version 1.8, XMLDSig version 1.8, SunPCSC version 1.8, Apple version 1.8]
  • 测试 Linux:[SUN version 1.8, SunRsaSign version 1.8, SunJSSE version 1.8, SunJGSS version 1.8, SunSASL version 1.8, XMLDSig version 1.8, SunPCSC version 1.8]

4. 强制添加加密包无效

  • 然后测试环境强制添加:Security.addProvider(new com.sun.crypto.provider.SunJCE());
  • 抛出异常,还是找不到 jar 包
    com.sun.crypto.provider.SunJCE() 2022-04-19 17:16:09,144 \[// - - -\] ERROR com.alibaba.dubbo.rpc.filter.ExceptionFilter - \[DUBBO\] Got unchecked and undeclared exception which called by xxx.xxx.xxx.xxx. service: com.xxx.xxx, method: xxx, exception: Java.lang.NoClassDefFoundError: com/sun/crypto/provider/SunJCE, dubbo version: x.x.x, current host: xxx.xxx.xxx.xxx Java.lang.NoClassDefFoundError: com/sun/crypto/provider/SunJCE
  • Linux 下载 JDK 查对应包,是存在的
    \$JAVA_HOME/jre/lib The 4 jar packages in the / directory are as follows: jce.jar security/US_export_policy.jar security/local_policy.jar ext/sunjce_provider.jar

5. 找到 JVM 类加载问题

  • 随后想到,问题就是 JVM 类加载时无法加载到这个类,查到这个类具体在 JRE 的:/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/jre/lib/ext/sunec.jar
  • 隐约想起《码出高效》上面写过,Extension ClassLoader 加载了 jre/lib/ext/*.jar
  • 正好对上了,那就在项目中搜索这几个关键词,发现启动脚本使用了:-DJava.ext.dirs=$DEPLOY_DIR/lib
  • 搜索发现,这个命令会覆盖 Java 本身的 ext 包的加载,而去加载指定 pom 文件的 jar 包,找到 jar 目录发现其他加密包均存在,果然少了 SunJCE 加密包
  • 因此使用此加解密算法就会抛出异常

3. 解决方案

  • 有三种解决方案
    • 将 ext 相关 jar 包复制到当前 lib 目录,重启加载此 jar 包
    • -DJava.ext.dirs 配置多个目录,重启加载此 jar 包
    • 将 jar 包打包发布到 Nexus Maven 私服,使用 Maven 依赖即可

相关内容

热门资讯

八个字的成语励志,奋斗的八字成... 八个字的成语励志目录八个字的成语励志奋斗的八字成语有哪些励志的8字成语八个字的成语励志 志存高...
什么是BI ?企业数字化的规划... BI技术是使现代企业能够利用数据做出合理,基于事实和可行的决策以改善其运营和利润率的工...
手机上怎么查移动详单,如何查中... 1. 下载并打开中国移动APP。 3. 点击底部导航栏的“分类”。 4. 在“分类”页面...
最近有什么好看的电影吗,最近有... 最近有什么好看的电影吗目录最近有什么好看的电影吗最近有什么好看的电影啊(推荐几部必看的影片)最近有哪...
iphone8p尺寸多大,苹果... iphone8p尺寸多大目录iphone8p尺寸多大苹果8pIus屏幕长宽多少厘米?不是机身尺寸!是...
半夜影院开吗,电影院晚上几点关... 半夜影院开吗目录半夜影院开吗电影院晚上几点关门?凌晨两点多还能进电影院吗西宁凌晨能开的电影院有哪些半...
Python科研绘图——介绍 “在做科研的路上,避免不了制作结果图,像常见的作图软件如Prism&#x...
MySQL查看正在运行的SQL MySQL查看正在运行的SQL 前言 ​ 在安装MySQL的时候会默认初始化几个MySQL运行所需的...
秒杀限制人群,如何设计秒杀服务... 对于秒杀业务,大家应该比较熟悉了。比如,“某商品原价 1299 元&#x...
张国荣是怎么走的,张国荣怎么死... 张国荣是怎么走的目录张国荣是怎么走的张国荣怎么死的 张国荣去世原因张国荣是怎么去世的张国荣是怎么死的...
跨年之夜的说说,关于跨年夜的心... 跨年之夜的说说目录跨年之夜的说说关于跨年夜的心情说说 一个人跨年的伤感说说(精选28句)2022年跨...
三连是什么梗,网络用语三连是什... 三连是什么梗目录三连是什么梗网络用语三连是什么意思?小红书评论三连是什么意思?三连是什么梗 三...
博迪学校怎么招生,西安博迪小学... 博迪学校怎么招生目录博迪学校怎么招生西安博迪小学入学条件是什么教育培训机构如何去招生?博迪学校怎么招...
100天精通Python(可视... 文章目录0. 专栏导读1. 普通折线图2. 网格折线图3. 趋势折线图4. 对比折线图5. 百分比折...
基础和高级的ACL的基础配置和... 基础和高级的ACL的基础配置和原理 需求 如图配置设备的IP地址售后服务部不允许访问财务部服务器&#...
linux入门---gdb的使... 目录标题gdb是什么如何使用gdb打开文件如何查看release和debug的不同正式调试l断点运行...
会计做账步骤是什么,财务做账要... 会计做账步骤是什么目录会计做账步骤是什么财务做账要怎么做账会计做账的步骤一般是怎么样的呢?会计手工做...
大学生可以贷款吗,大学生可以向... 大学生可以贷款吗目录大学生可以贷款吗大学生可以向银行贷款吗在校大学生能贷款么?大学生可以贷款吗 ...
社交新时代,元宇宙结合游戏应用... 人是社会动物,需要进行社交。社交的本质是人与人之间通过某种方式或工具传递信息ÿ...
超市买的腊肠可以直接吃吗,超市... 超市买的腊肠可以直接吃吗目录超市买的腊肠可以直接吃吗超市买来的腊肠直接可以吃吗?腊肠买回来就能吃吗?...
讣告什么意思,讣告 [fù g... 讣告什么意思目录讣告什么意思讣告 [fù gào]什么意思?近义词和反义词是什么?英文翻译是什么?讣...
【JVM】字节码指令全解 文章目录 入门案例原始 java 代码编译后的字节码文件常量池载入运行时常量池方法字节码载入方法区m...
电动自行车后轮轴承怎么拆,拆装... 电动自行车后轮轴承怎么拆目录电动自行车后轮轴承怎么拆拆装电动车后轮及轴承视频教程电动车后轮轴承怎么拆...
奇葩说六季冠军分别是谁,奇葩说... 奇葩说六季冠军分别是谁目录奇葩说六季冠军分别是谁奇葩说第一届冠军是谁?
移动有什么套餐流量多,中国移动... 移动有什么套餐流量多目录移动有什么套餐流量多中国移动流量套餐有哪些?移动有什么流量多的套餐吗?移动有...
蓝桥杯刷题冲刺 | 倒计时20... 作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝...
标婷维e乳可以擦脸吗,标婷维生... 标婷维e乳可以擦脸吗目录标婷维e乳可以擦脸吗标婷维生素e乳可以擦脸吗标婷维生素E乳可以白天擦脸用吗?...
基于 Vite + Vue3 ... 方式一:手动完整引入(不推荐) 只需要在 main.js ...
临床决策曲线DCA如何解决预测... 临床决策曲线可以说解决了临床预测模型到临床应用的一个痛点。以前存在这样一个现象,一个预...
Gradio-Learning Gradio-Learning 文章目录Gradio-LearningInterface函数-展示单...