有的时候,你需要对spring boot的打的jar或war包里lib中的jar进行替换或增加时,直接使用Beyond Compare直接将对应的jar拉过去时,在运行时就会报It has been compressed and nested jar files must be stored without compression的错误,如果你是在源码工程的情况下,可以使用源码直接重新编译,如果没有,可以采用以下的方式进行处理,我们以myapp.war这个war为样例说明一下。
1、直接打成非压缩的jar包或war包
先将对应的jar或war包使用unzip解压出来,再用java的jar命令再打个非压缩的包,如:
unzip myapp.war -d myapp
cd myapp
jar -cvfM0 myapp.war ./*
其中myapp.war为你要操作的jar包
2、使用spring boot的spring-boot-maven-plugin插件重新打包
如果你本机有maven的环境,可以将你要操作的jar或war中的pom.xml文件给拿出来,因为我们只是要重新打包,并不用去下载工程里的jar包,所以可以将pom.xml里的<dependencies>都删除掉,只保留build,如:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<finalName>myapp</finalName>
</build>
再在pom.xml当前目录下新建target目录,在target目录里再将新建你要打包的jar或war的相同名字的目录名,然后将jar或war中的所有文件解压到该目录下,将需要增加或修改的jar也覆盖到lib中,整个目录结构如下:
repackage
pom.xml
target
myapp
META-INF
WEB-INF
index.html
然后在windows操作系统下使用cmd命令进行操作,cd到repackage目录里,然后运行以下命令
mvn package
这样最后就会在target下生成对应的jar或war包了
总结:第1个方法就比较简单,但是没有压缩的包的jar或war包会比较大,第2个方法虽然比较麻烦,但是是比较完美的解决方案,他跟使用源码重新打包得出的效果是一样的,原理就是使用spring-boot-maven-plugin插件的repackage功能进行打包处理,以处理成符合spring boot的jar包处理方式。