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包里面的文件,步骤如下:
jar tf xxx.jar
查看需要替换的文件的全路径- 在jar包所在目录按层级建立相对应的文件,例如BOOT-INFO/classes/database.properties
- 执行
jar uf xx xxx.jar
,例如jar uf BOOT-INFO xxx.jar
如果不确定执行结果可以加上参数v查看执行过程或者在执行完后使用jar xf xxx.jar
解压后检查
https://zhuhuogeng.github.io/2017/09/28/jar%E5%8C%85%E9%87%8D%E6%96%B0%E5%8E%8B%E7%BC%A9%E5%90%8E%E8%BF%90%E8%A1%8C%E5%87%BA%E9%94%99%E7%9A%84%E9%97%AE%E9%A2%98/
以上是 jar包重新压缩后运行出错的问题 的全部内容, 来源链接: utcz.com/z/518856.html