2012-03-29 18 views
5

Estoy tratando de obtener el tiempo de compilación del archivo JAR ejecutable que estoy exportando desde Eclipse. Una forma de hacerlo sería obtener el tiempo de modificación del archivo META-INF/MANIFEST.MF. Desafortunadamente, parece que no puedo encontrar la forma de obtener esta información (sé cómo leer el manifiesto usando getResourceAsStream("/META-INF/MANIFEST.MF"), pero parece que no puedo leer su tiempo de modificación).Obtener tiempo de compilación JAR

¿Alguien tiene alguna idea de cómo hacerlo?

Respuesta

3

Al final, basado en la respuesta de Aleks G y otras que se encuentran en otros lugares, se me ocurrió una solución más robusta (que por ejemplo, funciona también en redes compartidas):

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

Tenía la esperanza de una mejor manera para ir del objeto Class al nombre del recurso, pero supongo que esto tendrá que hacer.

7

Si usted tiene acceso al archivo jar en sí, debe ser capaz de leer el archivo JAR utilizando java.util.jar paquete, a continuación, obtener ZipEntry para el archivo de manifiesto y utilizar getTime() en ella para mostrar su último tiempo de actualización.

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

Si necesita tratar con la clase específica, entonces puede encontrar este código también útil;

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

Entonces jarFile contendrá el nombre de la ruta de la jarra. Tenga en cuenta que si la clase no se carga desde el archivo jar, la tercera línea fallará, ya que path.indexOf devolverá -1.

+0

Claro, pero esto se rompe horriblemente si se cambia el nombre del contenedor. ¿Puedo obtener una referencia al archivo JarFile real de donde se carga mi clase principal? – CAFxX

+0

Sí, debería poder obtenerlo a través del objeto del cargador de clases. –

+0

@CAFxX Actualicé mi respuesta para mostrar cómo obtener el nombre del archivo jar que tiene la clase. –

Cuestiones relacionadas