记录:替换线上springboot项⽬可执⾏jar包中依赖jar⾥的class⽂件
问题背景:
项⽬组发现线上版本问题后,定位是由于项⽬依赖的某个jar包中有个⼩BUG。
解决⽅案:
在修改了对应的java⽂件后,编译出对应的class⽂件。从⽣产环境下载项⽬jar包,解压后,到对应的依赖jar包,使⽤好压软件打开,⽤修改后的class⽂件覆盖原来的⽂件。
然后使⽤jar -cf0M XXX.jar -C imp . 命令将之前解压的⽂件夹重新打包成可执⾏jar包。有关jar命令参数可以参考下⾯(最后的“.”表⽰打包imp⽂件夹中所有⽂件):
⽤法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项:
-c 创建新档案
-t 列出档案⽬录
-x 从档案中提取指定的 (或所有) ⽂件
-u 更新现有档案
-v 在标准输出中⽣成详细输出
-f 指定档案⽂件名
-m 包含指定清单⽂件中的清单信息
-n 创建新档案后执⾏ Pack200 规范化
-e 为捆绑到可执⾏ jar ⽂件的独⽴应⽤程序
spring framework版本指定应⽤程序⼊⼝点
-0 仅存储; 不使⽤任何 ZIP 压缩
-P 保留⽂件名中的前导 '/' (绝对路径) 和 ".." (⽗⽬录) 组件
-M 不创建条⽬的清单⽂件
-
i 为指定的 jar ⽂件⽣成索引信息
-C 更改为指定的⽬录并包含以下⽂件
如果任何⽂件为⽬录, 则对其进⾏递归处理。
清单⽂件名, 档案⽂件名和⼊⼝点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。
⽰例 1: 将两个类⽂件归档到⼀个名为 classes.jar 的档案中:
jar cvf classes.jar Foo.class Bar.class
⽰例 2: 使⽤现有的清单⽂件 'mymanifest' 并
将 foo/ ⽬录中的所有⽂件归档到 'classes.jar' 中:
jar cvfm classes.jar mymanifest -C foo/ .
注意:不能直接将新的依赖jar包通过好压替换到项⽬jar包中,运⾏jar包时会出现如下错误信息:
Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/icity-core-2.1.0.jar
at org.springframework.boot.loader.NestedArchive(JarFileArchive.java:113)
at org.springframework.boot.loader.NestedArchives(JarFileArchive.java:87)
at org.springframework.boot.ClassPathArchives(ExecutableArchiveLauncher.java:69)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/icity-core-2.1.0.jar'
at org.springframework.boot.loader.NestedJarFile(JarFile.java:261)
at org.springframework.boot.loader.NestedJarFile(JarFile.java:247)
at org.springframework.boot.loader.NestedArchive(JarFileArchive.java:109)
... 4 more
Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/icity-core-2.1.0.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your exec at org.springframework.boot.loader.ateJarFileFromFileEntry(JarFile.java:287)
at org.springframework.boot.loader.ateJarFileFromEntry(JarFile.java:269)
at org.springframework.boot.loader.NestedJarFile(JarFile.java:258)
... 6 more
这个错误的意思是⽆法打开其中依赖的jar包,因为它被压缩了。所以我才⽤jar命令其中的参数-0表⽰仅存储,不做任何zip压缩。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论