Java JarInputStream类getManifest() 为空

背景&问题描述:

工作中有需要利用logback实现日志脱敏处理,最后实现为:编写脱敏逻辑java代码编译成class文件,塞到logback-classic-1.2.3.jar 内,应用加载魔改后台的jar包配合logback配置文件实现。 随后发现并应用加载新jar包失败,追踪到类似如下代码:

image.png

第一段的jar是未修改的,正常运行。
第二段的jar是修改后的,line24 getMainAttributes 报错空指针,得知jarFile2.getManifest() 返回可能为空。
复制代码

原因

我的理解就是破坏了jar包的完整性,需要重新打包。 摘自stackoverflow

It's a bug in JarInputStream that MANIFEST.MF must be in the first entries in a ZIP file, like this:

$ jar -tvf example-correct-archive.jar
  623 Thu Jun 13 12:13:42 CEST 2019 META-INF/MANIFEST.MF
    0 Thu Jun 13 12:13:42 CEST 2019 META-INF/
    ...
复制代码

解决方式

通过如下操作使用jar命令重新打包。

a) Reorder entries in JAR file using jar tool:

  • unpack test.jar file to directory foo
  • move existing MANIFEST.MF file one level above directory foo and remove META-INF directory
  • inside foo directory run command: jar cvfm ../test.jar ../MANIFEST.MF .
  • outside of foo you will get fixed JAR file with correct entries order

b) use JarFile instead of JarInputStream

Guess you like

Origin juejin.im/post/7052632557557006372