我遇到了java.util.zip.ZipException:無效的存儲塊長度。無法在jar文件被替換時加載jar文件中的資源
的堆棧跟蹤如下:
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上,Os是Windows。
是否有人可以解釋爲什麼SystemClassLoader在屬性存在時未能加載?我感謝您的幫助。
感謝您的回答!這是非常合理的。在JVM停止之前,JVM是否永遠不關閉InputStream? JVM如何判斷jar的內容是否改變? –