0%

jar包重新压缩后运行出错的问题

在部署应用的时候,由于线上与测试环境的配置不同(例如数据库的url),有时候我们需要在对应的环境把jar(或war)包里面的配置文件替换掉。
针对这种问题,以前一直采用的方案是先jar xf xxx.jar解压这个jar包,替换文件后,使用jar cfM xxx.jar *来重新压缩。
由于以前打包的时候是使用的shadowJar插件,用这个方法替换一直没出问题。最近打包插件替换成了springBoot的,使用这个方式替换会导致新的jar包运行出错的问题。于是使用了jar uf xx xxx.jar的方式来替换,在此对旧的替换方法出的问题做一个总结并且记录一下新的替换方式的使用方法。

问题1:运行时提示依赖的jar文件被压缩

错误信息:

Exception in thread "main" java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/xxxxx.jar'.
It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file

错误重现:

我们这个项目的运行方式是将项目用gradle的bootRepackage插件打成jar包,然后执行java -jar xxx.jar来执行的。
由于线上与测试环境的配置不同(例如数据库的url),所以jar包下载到线上服务器后会执行jar xf xxx.jar解压这个jar包,然后使用jar cfM xxx.jar *来重新压缩。压缩后使用java -jar xxx.jar执行就会出现jar文件被压缩的错误。
解决方案:
在压缩的时候添加-0这个参数。jar cf0M xxx.jar *压缩后可正常执行。


问题2:运行时部分代码卡住,不报错也不往下执行

错误信息:

无。程序直接卡住,没有任何报错。

新的替换方式

新的替换方式采用jar uf xx xxx.jar来更新jar包里面的文件,步骤如下:

  1. jar tf xxx.jar查看需要替换的文件的全路径
  2. 在jar包所在目录按层级建立相对应的文件,例如BOOT-INFO/classes/database.properties
  3. 执行jar uf xx xxx.jar,例如jar uf BOOT-INFO xxx.jar
    如果不确定执行结果可以加上参数v查看执行过程或者在执行完后使用jar xf xxx.jar解压后检查