2012-03-29 14 views
5

Próbuję uzyskać czas kompilacji działającego pliku JAR eksportowanego z Eclipse. Jednym ze sposobów, aby to zrobić, byłoby prawdopodobnie uzyskanie czasu modyfikacji pliku META-INF/MANIFEST.MF. Niestety nie mogę znaleźć sposobu na uzyskanie tych informacji (wiem, jak odczytać sam manifest przy użyciu getResourceAsStream("/META-INF/MANIFEST.MF"), ale nie mogę odczytać czasu jego modyfikacji).Uzyskaj czas kompilacji JAR

Czy ktoś ma pewien wgląd w to, jak to zrobić?

Odpowiedz

3

W końcu, na podstawie odpowiedzi Aleks G i inne znalezione gdzie indziej, wpadłem bardziej niezawodne rozwiązanie (że np działa również na udziałach sieciowych):

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

miałem nadzieję na lepszy sposób przejść od obiektu Class do nazwy zasobu, ale myślę, że to będzie konieczne.

7

Jeśli masz dostęp do samego pliku jar, powinieneś być w stanie odczytać pliku jar przy użyciu java.util.jar pakiet, a następnie uzyskać ZipEntry dla pliku manifestu i używać getTime() na to, aby dostać swój ostatni czas aktualizacji.

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

Jeśli chcesz zająć się konkretną klasą, możesz uznać ten kod za przydatny;

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

Następnie jarFile będzie zawierał nazwę ścieżki słoika. Zauważ, że jeśli klasa nie zostanie załadowana z pliku JAR, to trzecia linia nie powiedzie się, ponieważ path.indexOf zwróci -1.

+0

Oczywiście, ale to przeraża, jeśli słoik zostanie zmieniony. Czy mogę uzyskać odniesienie do pliku JarFile, z którego ładowana jest moja główna klasa? – CAFxX

+0

Tak, powinieneś być w stanie uzyskać to za pośrednictwem obiektu modułu ładującego klasy. –

+0

@CAFxX Zaktualizowałem swoją odpowiedź, aby pokazać, jak uzyskać nazwę pliku jar mającego klasę. –