自学内容网 自学内容网

动态加载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");
......


原文地址:https://blog.csdn.net/colorknight/article/details/144062942

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!