有的时候,你需要对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包处理方式。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐