2012-03-29 7 views
5

Ich versuche, die Kompilierzeit der ausführbaren JAR-Datei zu erhalten, die ich aus Eclipse exportiere. Ein Weg, dies zu tun, wäre wahrscheinlich, die Modifikationszeit der META-INF/MANIFEST.MF-Datei zu erhalten. Leider kann ich keine Möglichkeit finden, diese Informationen zu erhalten (ich weiß, wie man das Manifest selbst liest, indem man getResourceAsStream("/META-INF/MANIFEST.MF") verwendet, aber ich kann nicht scheinen, seine Änderungszeit zu lesen).Get JAR Kompilierungszeit

Hat jemand einen Einblick, wie es geht?

Antwort

3

Am Ende basierend auf Aleks G Antwort und anderswo fanden andere, kam ich mit einer robusteren Lösung bis (das zB funktioniert auch auf Netzwerkfreigaben):

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; 
    } 
} 

ich für eine bessere Art und Weise hatte gehofft, um vom Klassenobjekt zum Ressourcennamen zu gelangen, aber ich denke, das wird reichen müssen.

7

Wenn Sie den Zugriff auf die JAR-Datei hat selbst, sollten Sie in der Lage sein, die JAR-Datei java.util.jar Paket mit zu lesen, dann ZipEntry für die Manifest-Datei erhalten und verwenden getTime() auf es seine letzte Aktualisierungszeit zu erhalten.

Wenn Sie mit der spezifischen Klasse umgehen müssen, dann können Sie diesen Code auch nützlich finden;

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

Dann jarFile den Pfadnamen Ihres jar enthalten. Beachten Sie, dass die dritte Zeile fehlschlägt, wenn die Klasse nicht aus der JAR-Datei geladen wird, da path.indexOf -1 zurückgibt.

+0

Sicher, aber das bricht schrecklich, wenn das Glas umbenannt wird. Kann ich einen Verweis auf das eigentliche JarFile erhalten, aus dem meine Hauptklasse geladen wird? – CAFxX

+0

Ja, Sie sollten das durch das Klassenladeobjekt erreichen können. –

+0

@ CAFxX Ich habe meine Antwort aktualisiert, um zu zeigen, wie der Name der JAR-Datei mit der Klasse abgerufen werden kann. –

Verwandte Themen