提取JAR单个文件遇ZipException异常及相关更新操作的问题咨询
解决JAR单文件提取报错但全量提取正常的问题
我来帮你拆解这个有点矛盾的问题:你用jar -xf test.jar example.txt单独提取文件时触发了invalid CEN header (bad signature)错误,但全量提取jar -xf test.jar却完全正常;后来用unzip能成功提文件,可zip命令更新JAR时报错,jar -uf却又能顺利更新。
问题到底出在哪?
这大概率是你的JAR用了非标准的Zip结构扩展,或者构建时加了特殊压缩选项,导致不同工具对Zip结构的校验逻辑和兼容性不一样:
jar命令的单文件提取逻辑会严格校验Zip的中央目录(CEN)签名,一旦发现不符合标准的地方直接报错;但全量提取时,它会放宽校验,直接按条目读取数据,所以能成功。unzip工具的兼容性比Oracle/Sun的jar命令强得多,它能处理不少非标准的Zip结构,所以单文件提取没问题。- 至于
zip命令更新时报的expected 43976 entries but found 109512,说明JAR的中央目录记录的条目数和实际条目数不匹配(比如有重复条目或者目录结构被篡改过),但jar -uf的更新逻辑对这种异常容忍度更高,所以能成功。
实用解决方案
根据你的场景,给你几个靠谱的处理方式:
1. 直接用unzip提取单个文件
既然unzip test.jar example.txt能成功,就把它作为单文件提取的替代方案吧,兼容性拉满,完美避开jar命令的严格校验坑。
2. 继续用jar -uf更新文件
你已经验证过jar -uf test.jar example.txt能成功更新,这个方式可以继续用,它的更新逻辑不会纠结中央目录的签名问题,还能正确维护JAR的结构。
3. 彻底修复JAR的Zip结构
如果想一劳永逸解决问题,避免后续再出幺蛾子,可以把JAR全量提取后重新打包:
# 1. 全量提取所有内容 jar -xf test.jar # 2. 删除原JAR文件 rm test.jar # 3. 重新打包成标准JAR jar -cf test.jar *
重新打包后的JAR会采用标准Zip结构,之后用jar -xf提取单个文件就不会再报错了。
额外提醒
有些构建工具(比如特定版本的Maven、Gradle)或者压缩工具生成JAR时,可能会加一些额外的扩展字段或特殊压缩设置,导致JAR结构不标准,进而出现不同工具处理结果不一致的情况。如果你的JAR是自动构建的,可以检查下构建脚本的压缩配置,避免后续再生成这类“特殊”JAR。
内容的提问来源于stack exchange,提问作者Stew C
相关产品推荐
相关产品推荐

