2013-11-22 19 views
9

la mia webapp consente a un utente di caricare un file jar. tuttavia, dopo il caricamento del file jar, è danneggiato. ho verificato questo confrontando il checksum md5 (winmd5free).come verificare se un file jar è valido?

il file jar caricato sembra "normale" e "destra"

  • la dimensione del file rispetto all'originale guarda a destra (a livello KB)
  • posso aprire il file jar caricato utilizzando 7z e visualizzarne il contenuto (risorse e file di classe), e tutto ciò che è lo stesso rispetto a quello originale

quando apro il file jar caricato (con Notepad ++), ho notato che il contenuto binario sono diversi da quello originale . inoltre, quando ho usato JarInputStream per leggere le voci jar, non c'erano voci.

JarInputStream is = new JarInputStream(new FileInputStream(new File("uploaded.jar"))); 
JarEntry entry = null; 
while(null != (entry = is.getNextJarEntry())) { 
System.out.println(entry.getName()); 
} 

Inoltre, quando faccio doppio clic sul contenitore (Windows), viene visualizzato il seguente messaggio.

Error: Invalid or corrupt jarfile

le mie domande sono

  • c'è un modo per controllare a livello di codice se un file jar è valida? mi sarei aspettato JarInputStream per rilevare questo subito, ma non mostra alcun problema
  • quando faccio doppio clic sul file jar, in windows, è java.exe che mi sta dando il messaggio jarfile non valido o corrotto?
  • Come mai quando un file jar non valido viene passato come parte del classpath, non viene generato nessun errore/eccezione? per esempio. java -cp uploaded.jar; libs * com.some.class.Test?

Si prega di notare che questo non ha nulla a che fare con la firma di barattoli e/o il controllo della firma di un barattolo. si tratta semplicemente di verificare se un file (caricato o meno) è un file jar valido (non necessariamente se i file di classe del jar sono validi, poiché esiste già un altro post SO su questo problema).

risultati per l'esecuzione

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

Sulla riga di comando, eseguire il comando jar in questo modo: 'jar -tvf '. La "t" dice "test", "v" credo "verbose" e "f" significa "file". Puoi anche aprire un JAR in qualsiasi programma ZIP. – CodeChimp

+0

grazie, userò java.util.zip.ZipFile per vedere se riesco a controllare a livello di programmazione (vedi l'aggiunta modificata della traccia dello stack dall'esecuzione di quelle opzioni con lo strumento jar). –

+0

@CodeChimp 't'è per" Contenuto elenco di file JAR "come puoi vedere in https://docs.oracle.com/javase/tutorial/deployment/jar/view.html in modo da non testare i checksum dei contenuti (anche se deve essere un vaso più o meno valido per elencare le voci). – PhoneixS

risposta

7

un modo per rilevare programmazione un file jar non valido è quello di utilizzare 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(); 
    } 
} 

se il file jar non è valido, verrà generata una ZipException durante l'istanziazione di ZipFile.

+0

https://docs.oracle.com/javase/8/docs/api/java/util/jar/JarFile.html è un'altra opzione. –

Problemi correlati