很多时候我们发布的Springboot项目打成一个大的jar包,里面包含大量的三方依赖包,和自己的业务代码包,整体发布时间过长,需要只替换业务包子包或者class文件,进行快速的增量部署。
如果直接使用压缩软件或者命令压缩后,启动jar包可能会出现如下的错误:Caused by:java.io.IOException: Unable to open nested jar file "BOOT-INF/1ib/fastjson-1.2.79.jar,主要原因是由于文件被“加密压缩了”,注意下压缩选选里面使用 -0 选项, store only仅仅存储文件即可,切勿压缩文件。
目标jar文件:“spring.jar”,目标class文件“ ZentaoController.class”
一、替换指定的class或多个class到压缩包内
本方法特点是不解压整个jar包,仅仅把需要替换的文件替换进去。
1.找到文件在jar包中的路径,
jar -tvf spring.jar grap | ZentaoController.class
得到 文件全路径:BOOT-INF/classes/com/test/springbootest/controller/ZentaoController.class
2.将查找到的路径解压出来
jar -xvf spring.jar BOOT-INF/classes/com/test/springbootest/controller/ZentaoController.class
整个时候会在当前路径下生成带目录的文件夹以及目标文件
3.将新ZentaoController.class文件替换到目标路径下,替换掉老的文件
cp命令
4.将替换后的文件夹压回jar包(如果是jar文件请记得带上选项 -0)
jar -uvf0 spring.jar BOOT-INF/classes/com/test/springbootest/controller/ZentaoController.class
或者把这个controller包都重新压缩进去:
jar -uvf0 spring.jar BOOT-INF/classes/com/test/springbootest/controller
二、全部解压jar重新打包
1.解压这个jar包
jar -xvf spring.jar 到当前目录
或 unzip spring.jar
2.进入压缩后的目前 spring,并替换需要替换或者删除的文件
cd spring
cp ...
3.打包完成(把当前目录内的所有文件夹打包,记得带上选项 -0)
jar -cfM0 spring.jar *
或 jar -cfM0 spring.jar ./BOOT-INF ./META-INF/ ./org/
或 zip -r0 spring.jar *
或 zip -r0 spring.jar ./* -x *.DS_Store (过滤掉mac OS上面的.DS_Store系统文件)