当前位置: 首页 > article >正文

动态加载Jar包引发的“java.util.zip.ZipException: invalid distance too far back”

        当我们用Java语言编写插件容器时,需要动态加载与卸载jar包插件。如果jar包插件中的类存在读取Jar包内打包的资源文件的情况。那么当你升级Jar包插件并再次装载插件时,可能会碰到读取jar包内文件的代码处抛出“java.util.zip.ZipException: invalid distance too far back”异常的情况。

        该问题是因为Jar包内的资源文件在被访问后,会被保存在装载插件的类装载器中。若此时升级jar包,再次进行插件装载时,会引发文章中的异常。那么,一种合适的解决问题的办法就是,我们需要确保两次读取资源文件的类装载器不同就可以。若让插件每次的类装载器都不同,不会影响整个程序,那么可以采用这种方式解决。而本文将给出一种在插件内解决这类问题的方案,这样就可以在更小的影响范围解决以上的问题了。

        在插件内部,我们可以在加载文件之前,构造一个新的类装载器,确保由这个类装载器来装载我们要读取的资源文件。资源文件读取完后,就可以销毁类装载器了。

ClassLoader parentClassLoader = this.getClass().getClassLoader();
// 从父节点找到要读取的资源文件,并解析出文件的url
URL url = parentClassLoader.getResource("xxxx.json");
int index = url.toString().indexOf("!");
String u = url.toString().substring(4, index);
// 以资源文件的url构造类装载球
URLClassLoader classloader = new URLClassLoader(new URL[] { new URL(u) }, parentClassLoader);
// 用新构造的类装载器装载文件
InputStream is = classloader.getResourceAsStream("xxxx.json");
......


http://www.kler.cn/a/413773.html

相关文章:

  • Maven 依赖项配置
  • 【逐行注释】自适应观测协方差R的AUKF(自适应无迹卡尔曼滤波,MATLAB语言编写),附下载链接
  • 网络安全中的数据科学如何重新定义安全实践?
  • Web登录页面设计
  • DataGuard 架构和概念整理
  • 2686694 - 操作方法:MSEG - DBSQL_REDIRECT_INCONSISTENCY
  • 定制独立站系统需要哪些技术支持?
  • 不间断电源 (UPS) 对现代技术可靠性的影响
  • 机器学习之DeepMind推出的DreamerV3
  • 代码随想录-笔记-其五
  • 基于springboot的登录校验
  • 通信网络安全
  • Java对象与XML互相转换(xstream)
  • 本地化部署 私有化大语言模型
  • ABAP OOALV模板
  • Android中ByteBuffer内存池设计示例
  • 23种设计模式之外观模式
  • linux添加附加磁盘
  • CFD 在生物反应器放大过程中的作用
  • 拍立淘按图搜索实战化,拍立淘API接口参数说明
  • 在 Ubuntu 上部署 MediaWiki 开源维基平台
  • Jetpack业务架构(ViewModel)
  • Linux系统之iotop命令的基本使用
  • 【EI会议征稿通知 | 往届均已见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)
  • 分类预测 | Matlab实现GA-XGBoost分类预测
  • 使用Eureka实现服务注册与发现的具体案例详解