2013-11-22 30 views
9

我的webapp允許用戶上傳jar文件。但是,在jar文件上傳後,它已損壞。我通過比較md5校驗和(winmd5free)驗證了這一點。如何檢查jar文件是否有效?

上傳的jar文件看起來「正常」和「右」

  • 文件大小比原來的期待權(在KB級)
  • 我可以用7z格式打開上傳的jar文件,查看其內容(資源類文件),一切都是比較原始

當我打開(用記事本+ +),我也注意到,二進制內容從原來的不同上傳的jar文件相同。另外,當我使用JarInputStream讀取jar條目時,沒有條目。此外,當我雙擊jar(Windows)時,我收到以下消息。

Error: Invalid or corrupt jarfile

我的問題是

  • 有沒有辦法以編程方式檢查jar文件是否有效?我會期望JarInputStream檢測到這一點,但它沒有顯示任何問題
  • 當我雙擊jar文件,在Windows中,它是java.exe是給我無效或損壞的jarfile消息?
  • 當一個無效的jar文件作爲類路徑的一部分傳入時,怎麼會發生錯誤/異常?例如java -cp uploaded.jar; libs * com.some.class.Test

請注意,這與jar簽名和/或檢查jar簽名無關。它只是檢查一個文件(上傳與否)是否是一個有效的jar文件(不一定如果jar的類文件是有效的,因爲在這個問題上已經有另一個SO文章了)。

結果運行

jar -tvf uploaded.jar

java.util.zip.ZipException: error in opening zip file 
     at java.util.zip.ZipFile.open(Native Method) 
     at java.util.zip.ZipFile.<init>(ZipFile.java:127) 
     at java.util.zip.ZipFile.<init>(ZipFile.java:88) 
     at sun.tools.jar.Main.list(Main.java:977) 
     at sun.tools.jar.Main.run(Main.java:222) 
     at sun.tools.jar.Main.main(Main.java:1147) 
+1

在命令行上,像這樣運行jar命令:'jar -tvf '。 't'表示「測試」,'v'我認爲意思是「詳細」,而'f'表示「文件」。您也可以在任何ZIP程序中打開JAR。 – CodeChimp

+0

謝謝,我將使用java.util.zip.ZipFile來查看是否可以通過編程方式檢查(請參閱使用jar工具運行這些選項來修改堆棧跟蹤的添加)。 –

+0

@CodeChimp't'是你可以在https://docs.oracle.com/javase/tutorial/deployment/jar/view.html看到的「列出JAR文件的內容」,因此它不會測試內容的校驗和(儘管它需要是一個更有效的jar來列出條目)。 – PhoneixS

回答

7

一種以編程方式檢測無效的jar文件是使用java.util.ZipFile。

public static void main(String[] args) { 
    if(args.length < 1) { 
     System.err.println("need jar file"); 
     return; 
    } 

    String pathname = args[0]; 
    try { 
     ZipFile file = new ZipFile(new File(pathname)); 
     Enumeration<? extends ZipEntry> e = file.entries(); 
     while(e.hasMoreElements()) { 
      ZipEntry entry = e.nextElement(); 
      System.out.println(entry.getName()); 
     } 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

如果jar文件無效,則在實例化ZipFile時將引發ZipException。

+0

https://docs.oracle.com/javase/8/docs/api/java/util/jar/JarFile.html是另一種選擇。 –