同学们可以私信我加入学习群!
正文开始
- 前言
- 一、手动模拟过程定位问题
- 二、jdk提供的jar包压缩工具
- 总结
前言
我使用插件yauzl把jar包解压缩、修改properties、压缩后,发现新的jar包无法运行,提示:xxx.jar中没有主清单属性
然后通过对比新jar包和旧jar包发现,两者不论从文件内容还是文件层级,都是一模一样的,除了最终jar包大小不同。
所以合理猜测,因为压缩方式的不同,导致不同压缩比例的jar包会无法运行。
一、手动模拟过程定位问题
现在最重要的是定位问题。我大概经历了以下几步:
- 排除properties改变带来的影响:
我将未修改的properties放到新jar包中,发现新jar包还是无法运行,然后新jar包修改过的properties放到旧jar包中,发现旧jar包可以运行,可以得出结论,新jar包无法运行,和修改properties无关。
- 我的代码主要功能是以下三步自动化:
a)jar包解压缩。
b)修改properties
c) 修改后的文件夹压缩回jar包
用解压缩软件,手动的方式重复上面a c两个步骤,其b步骤可能的影响已经排除。发现jar经过手动解压缩和压缩后,新的jar就不能运行。
由此可知,影响jar包运行的可能不是我们的代码,而是和压缩方式有关。
- 通过观察,发现新旧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包也是一种压缩包),有点冗余,后期在把前端部署的工具也完成后,应该寻找一个最佳实践方案,尽量统一。
大胆怀疑,细心求证。少说话,多做事,不做无谓的精神内耗。
——中二少年。