2012-03-29 15 views
5

Sto cercando di ottenere il tempo di compilazione del file JAR eseguibile che sto esportando da Eclipse. Un modo per farlo sarebbe probabilmente ottenere il tempo di modifica del file META-INF/MANIFEST.MF. Sfortunatamente non riesco a trovare un modo per ottenere questa informazione (so leggere il manifest stesso usando getResourceAsStream("/META-INF/MANIFEST.MF"), ma non riesco a leggere i suoi tempi di modifica).Ottenere il tempo di compilazione JAR

Qualcuno ha qualche idea su come farlo?

risposta

3

Alla fine, in base alla risposta del Aleks G e altri trovati altrove, mi si avvicinò con una soluzione più robusta (che ad esempio, funziona anche su condivisioni di rete):

public static Long getTime(Class<?> cl) { 
    try { 
     String rn = cl.getName().replace('.', '/') + ".class"; 
     JarURLConnection j = (JarURLConnection) ClassLoader.getSystemResource(rn).openConnection(); 
     return j.getJarFile().getEntry("META-INF/MANIFEST.MF").getTime(); 
    } catch (Exception e) { 
     return null; 
    } 
} 

speravo in un modo migliore per passare dall'oggetto Class al nome della risorsa ma immagino che questo dovrà fare.

7

Se si ha accesso al file jar in sé, si dovrebbe essere in grado di leggere il file jar utilizzando java.util.jar pacchetto, quindi ottenere ZipEntry per il file manifesto e utilizzare getTime() su di esso per ottenere la sua ultima volta aggiornamento.

JarFile jf = new JarFile("myfile.jar"); 
ZipEntry manifest = jf.getEntry("META-INF/MANIFEST.MF"); 
long manifestTime = manifest.getTime(); //in standard millis 

Se è necessario gestire la classe specifica, è possibile che questo codice sia utile;

String rn = this.getClass().getName().replace('.', '/') + ".class"; 
String path = getClass().getClassLoader().getResource(rn).getPath(); 
String jarFile = path.substring(0, path.indexOf("!")); 

Poi jarFile conterrà il nome del percorso del vostro vaso. Nota che se la classe non viene caricata dal file jar, la terza riga fallirà, poiché path.indexOf restituirà -1.

+0

Certo, ma questo si interrompe orribilmente se il barattolo viene ribattezzato. Posso ottenere un riferimento all'effettivo JarFile da cui viene caricata la mia classe principale? – CAFxX

+0

Sì, dovresti essere in grado di ottenerlo attraverso l'oggetto classloader. –

+0

@CAFxX Ho aggiornato la mia risposta per mostrare come ottenere il nome del file jar con la classe. –

Problemi correlati