本文介紹了JarInputStream為現有清單文件返回空的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我在使用JarInputStream獲取(完全)操作的.jar文件的清單時遇到問題,我得到空指針。嘗試了幾個略有不同的文件,沒有拋出異常。注意:此文件來自代碼生成器。具有以下結構(希望此形狀有助于您理解):
|[+]test.jar
|[+]META-INF
|MANIFEST.MF
|[+]mypackage
|MyClass.class
|text.txt
上面是類的一部分(注意:此類不在.jar內)
/*...code...**/
File jar = new File("resources/test.jar");
FileInputStream fis = new FileInputStream(jar);
JarInputStream jis = new JarInputStream(fis);
Manifest jarManifest = jis.getManifest();
Attributes jarManifestAttributes = jarManifest.getMainAttributes(); //line 25
String mainClass = jarManifestAttributes.getValue("Main-Class");
/*...code...**/
運行上面的代碼時,拋出以下異常:
Exception in thread "main" java.lang.NullPointerException
at crypter.LoadJar.main(LoadJar.java:25)
因此jarManifest的值為空值。
EDIT1
MANIFEST.MF
Manifest-Version: 1.0
Main-Class: mypackage.MyClass
Permissions: all-permissions
Name: text.txt
Name: mypackage/MyClass.class
EDIT2
jar -tvf reverse_tcp2.jar
37 Sat Jan 07 11:31:14 EET 2017 text.txt
0 Sat Jan 07 11:31:14 EET 2017 mypackage/
8513 Sat Jan 07 11:31:14 EET 2017 mypackage/MyClass.class
0 Sat Jan 07 11:31:14 EET 2017 META-INF/
145 Sat Jan 07 11:31:14 EET 2017 META-INF/MANIFEST.MF
ZIP
這是JarInputStream
中的錯誤,MANIFEST.MF
必須位于推薦答案文件的前幾個條目中,如下所示:
$ 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/
...
在您的情況下,該條目之前還有3個其他文件。
解決方法
a)使用jar
工具重新排序JAR文件中的條目:
將test.jar
文件解壓縮到目錄foo
將現有MANIFEST.MF
文件移到目錄上一級foo
并刪除META-INF
目錄
內部foo
目錄運行命令:jar cvfm ../test.jar ../MANIFEST.MF .
在foo
之外,您將獲得具有正確條目順序的修復JAR文件
b)使用JarFile
而不是JarInputStream
詳細信息
參見JDK-8031748 Clarify jar entry orders in a jar file:
從一開始,JAR文件就有一個”未記錄的”假設
MANIFEST.MF文件和與簽名相關的文件(塊和SF)應
出現在開頭(除了目錄條目,比如說,
META-INF/)。
(…)
這篇關于JarInputStream為現有清單文件返回空的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,