本文介紹了如何檢查JAR文件是否有效?的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
My WebApp允許用戶上傳JAR文件。但是,上載JAR文件后,它會被損壞。我已經(jīng)通過比較上傳文件(Winmd5free)前后的MD5校驗(yàn)和來驗(yàn)證這一點(diǎn)。
上傳的JAR文件與原始JAR文件幾乎相同:
文件大小與原始文件相似(以KB為單位)
我可以使用解壓程序打開上傳的JAR文件并查看其內(nèi)容(資源和類文件),與原始文件相比一切都是一樣的
當(dāng)我打開上傳的JAR文件(使用記事本++)時(shí),我確實(shí)注意到二進(jìn)制內(nèi)容與原始內(nèi)容不同。此外,當(dāng)我使用JarInputStream
讀取JAR條目時(shí),沒有條目。
JarInputStream is = new JarInputStream(new FileInputStream(new File("uploaded.jar")));
JarEntry entry = null;
while(null != (entry = is.getNextJarEntry())) {
System.out.println(entry.getName());
}
此外,當(dāng)我雙擊JAR(Windows)時(shí),我得到以下消息。
錯(cuò)誤:Jarfile無效或損壞
我的問題是:
有沒有辦法以編程方式檢查JAR文件是否有效?我本希望JarInputStream
立即檢測到這一點(diǎn),但它根本沒有顯示任何問題
當(dāng)我在Windows中雙擊JAR文件時(shí),是不是是java.exe向我顯示了無效或損壞的JAR文件消息?
當(dāng)無效的JAR文件作為類路徑的一部分傳入時(shí),為什么沒有拋出錯(cuò)誤/異常?例如,運(yùn)行java -cp uploaded.jar;libs* com.some.class.Test
命令?
這個(gè)問題與JAR簽名和/或檢查JAR文件的簽名無關(guān)。它只是檢查一個(gè)文件(上傳與否)是否為有效的JAR文件(不一定檢查JAR的類文件是否有效,因?yàn)橐呀?jīng)有關(guān)于此問題的另一篇SO文章)。
我的運(yùn)行結(jié)果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)
推薦答案
以編程方式檢測無效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文件無效,則實(shí)例化ZipFile
對象時(shí)將拋出ZipException
。
這篇關(guān)于如何檢查JAR文件是否有效?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,