最近接手一个双无项目(无文档,无技术支持,有源码),由于已经在线运营,又有在线BUG需要处理。没人可以保证仓库的源码和线上的能够完全对应,为了保险起见,前期采用打class补丁的方案进行处理,改哪打哪,缩小问题范围。
由于项目使用了spring-boot-maven-plugin,又采用了多模块的方式打包,打包的模块又以jar的方式存在于主jar的BOOT-INF/lib下。
结果是要替换的代码被2层jar包裹的严严实实,对于jar里的class,还是像往常那样,改为tar后用7z拖进去更新就可以了。但是在更新lib下的jar时,出现问题了。运行时报错:
It has been compressed and nested jar files must be stored without compression
看意思是嵌套jar必须不压缩。然后一看导入后的大小,jar包确实被压缩了。
看来碰到个难搞的问题了。找了一圈,windows的7z工具也没有配置的地方。
google搜了一圈,没有结果。问了一圈AI,也没有直接的解决办法。2个小时过去了,折腾没有结果。忽然想起来AI解释是压缩包里是采用ZIP压缩格式的数据,想起来windows下拖入会自动压缩,那我用命令行指定不就成了吗?
说干就干,WSL跑起来,p7zip装起来。问了下AI命令行格式,捣鼓出了更新命令:
7za a -mx0 xxx-mobile-api-0.1.0-exec.jar BOOT-INF/lib/xxx-db-0.1.0.jar
结果提示jar格式无法被处理。改成tar,也不成
抱着最后一搏的心态,改成了.zip。结果竟然惊喜的通过了!
2个多小时折腾的结果,写成了这样一份脚本。以更新数据库模块举例:
updatedb.sh
#!/bin/bash
mv xxx-mobile-api-0.1.0-exec.jar xxx-mobile-api-0.1.0-exec.zip
7za a -mx0 xxx-mobile-api-0.1.0-exec.zip BOOT-INF/lib/xxx-db-0.1.0.jar
mv xxx-mobile-api-0.1.0-exec.zip xxx-mobile-api-0.1.0-exec.jar
使用Linux的p7zip更新jar包打class和资源补丁,实现了不报错可运行