2015-03-31 77 views
0

我無法使用java.util.jar.JarFile類讀取jar文件中清單的內容。最終,我試圖解決的問題是確定一個特定的jar文件是否在其清單中有一個Main-Class條目,但在我到達那裏之前,我將清單清空。無法使用java.util.jar.JarFile讀取jar清單

考慮這個最小的測試案例:

public class ReadJar { 
    public static void main(String[] args) { 
    try { 
     java.util.jar.JarFile jf = new java.util.jar.JarFile("Hello.jar"); 
     System.out.println("Manifest entries: " + jf.getManifest().getEntries()); 
    } catch (java.io.IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

我如下測試它:

$ cat Hello.java 
public class Hello { 
    public static void main(String[] args) { 
    System.out.println("Hello"); 
    } 
} 
$ cat mainifest.txt 
Main-Class: Hello 
$ javac Hello.java 
$ jar cfm Hello.jar mainifest.txt Hello.class 
$ java -jar Hello.jar 
Hello 
$ javac ReadJar.java 
$ java ReadJar 
Manifest entries: {} 
$ 

看來,我是正確創建的罐子,因爲它可以與java -jar運行命令。清單的人工檢查對我來說也是正確的:

$ unzip -d temp Hello.jar 
Archive: Hello.jar 
    creating: temp/META-INF/ 
    inflating: temp/META-INF/MANIFEST.MF 
    inflating: temp/Hello.class   
$ cat temp/META-INF/MANIFEST.MF 
Manifest-Version: 1.0 
Created-By: 1.8.0_40-internal (Oracle Corporation) 
Main-Class: Hello 

$ 

那麼如何正確讀取清單?是否有我應該使用的不同於java.util.jar.JarFile的課程?

回答

2

您MANIFEST.MF中的所有內容都是main attributes。因此您可以使用此功能獲取getMainAttributes()的屬性。從那裏你可以得到密鑰集,然後嘗試迭代它並從密鑰中獲取值。

+0

完美。謝謝。對於那些稍後看到的,將我的'println'行更改爲'jf.getManifest()。getMainAttributes().keySet()'獲得我期望的[Created-By,Manifest-Version,Main-Class] 。 – Will 2015-03-31 05:34:27