gpt4 book ai didi

java - 替换jar文件时无法加载jar文件中的资源

转载 作者:行者123 更新时间:2023-12-03 03:14:48 25 4
gpt4 key购买 nike

我遇到 java.util.zip.ZipException:存储 block 长度无效。

堆栈跟踪如下:

Caused by: java.util.zip.ZipException: invalid stored block lengths
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at java.util.Properties$LineReader.readLine(Unknown Source)
at java.util.Properties.load0(Unknown Source)
at java.util.Properties.load(Unknown Source)

当我的项目尝试升级时会发生这种情况。升级逻辑是用新的jar文件替换旧的jar文件,并且JVM仍然运行。

有一个jar文件(jarA.jar)包含一个属性文件,属性文件记录了一些完整的类名。这些类名将用于通过反射创建实例。升级逻辑尝试使用 SystemClassLoader.getResourceAsStream() 加载属性文件。

如果jar文件(jarA.jar)被替换为新的,并且属性的内容被改变,就会发生这个异常。看来 SystemClassLoader 无法正确加载属性。

该项目由java1.4编译,运行在jre1.7上,操作系统为Windows。

有人可以解释为什么 SystemClassLoader 在该属性存在时无法加载吗?我感谢您的帮助。

最佳答案

通常只有在第一次需要时才会从 jar 文件中读取类。

当您在 JVM 运行时替换 jar 文件时,JVM 所拥有的文件 InputStream 已过时。在这种情况下,如果 JAR 文件的内容没有更改,则可以从 jar 中读取类。如果替换的 jar 与旧的 jar 具有不同的内容,则过时的 InputStream 将尝试读取它已知的位置。但是,由于内容已更改,因此可能无法读取该文件。

因此出现此异常

关于java - 替换jar文件时无法加载jar文件中的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17060411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com