jar包的解压缩和压缩后重新运行,报错:xxx.jar中没有主清单属性

同学们可以私信我加入学习群!

jar包的解压缩和压缩后重新运行,报错:xxx.jar中没有主清单属性_第1张图片

正文开始

  • 前言
  • 一、手动模拟过程定位问题
  • 二、jdk提供的jar包压缩工具
  • 总结


前言

我使用插件yauzl把jar包解压缩、修改properties、压缩后,发现新的jar包无法运行,提示:xxx.jar中没有主清单属性

然后通过对比新jar包和旧jar包发现,两者不论从文件内容还是文件层级,都是一模一样的,除了最终jar包大小不同。

所以合理猜测,因为压缩方式的不同,导致不同压缩比例的jar包会无法运行。


一、手动模拟过程定位问题

现在最重要的是定位问题。我大概经历了以下几步:

  1. 排除properties改变带来的影响:

我将未修改的properties放到新jar包中,发现新jar包还是无法运行,然后新jar包修改过的properties放到旧jar包中,发现旧jar包可以运行,可以得出结论,新jar包无法运行,和修改properties无关。

  1. 我的代码主要功能是以下三步自动化:

a)jar包解压缩。
b)修改properties
c) 修改后的文件夹压缩回jar包

用解压缩软件,手动的方式重复上面a c两个步骤,其b步骤可能的影响已经排除。发现jar经过手动解压缩和压缩后,新的jar就不能运行。

由此可知,影响jar包运行的可能不是我们的代码,而是和压缩方式有关。

  1. 通过观察,发现新旧jar包虽然所有文件内容、文件层级都相同,但是最终的jar包大小有差别,所以尝试用存储方式(不做任何压缩)压缩文件,得到jar包,然后运行正常。

现在就可以定为到问题:jar包经过代码解压缩、配置文件修改、压缩后,无法正常运行的原因可能和jar包压缩方式有关。

二、jdk提供的jar包压缩工具

jdk提供了jar包的文件处理、jar包解压缩、jar包压缩工具,这也是为什么我要把jre改成jdk的原因,但是这样有两个不好的地方:一是环境变大;二是jar包和jdk强关联绑定。不过目前还是采用这个最简单的方案。

jdk提供的jar包工具提供了参数0(这是阿拉伯数字零),在产生jar包时不对其中的内容进行压缩处理。

我原来的命令:

${jdkPath}\\bin\\jar vcf0 ${jarPath} -C ${copyPath} . 

代码含义是找到jdk路径,在jdk路径下运行jar命令,命令参数是vcf0,jar包地址是jarPath,要压缩的文件目录是copyPath。


总结

目前项目中关于文件解压缩的工具有两三个(jar包也是一种压缩包),有点冗余,后期在把前端部署的工具也完成后,应该寻找一个最佳实践方案,尽量统一。

大胆怀疑,细心求证。少说话,多做事,不做无谓的精神内耗。
——中二少年。

你可能感兴趣的:(前后端便捷工具开发,jar,java,node.js)