2012-03-29 2 views
5

Я пытаюсь получить время компиляции исполняемого JAR-файла, который я экспортирую из Eclipse. Одним из способов сделать это, вероятно, было бы получить время модификации файла META-INF/MANIFEST.MF. К сожалению, я не могу найти способ получить эту информацию (я знаю, как читать сам манифест с помощью getResourceAsStream("/META-INF/MANIFEST.MF"), но, похоже, я не могу прочитать его время модификации).Получить время компиляции JAR

У кого-нибудь есть представление о том, как это сделать?

ответ

3

В конце концов, на основе ответа Aleks G и другие нашли в другом месте, я придумал более надежное решение (что, например, работает также на сетевые ресурсы):

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

я надеялся на лучший способ перейти от объекта класса к имени ресурса, но я думаю, что это нужно будет сделать.

7

Если у вас есть доступ к самому банку файлу, вы должны быть в состоянии прочитать файл банка, используя java.util.jar пакет, а затем получить ZipEntry для манифеста файла и использовать getTime() на него, чтобы получить его последнее обновление.

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

Если вам нужно иметь дело с конкретным классом, вы можете найти этот код также полезным;

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

Тогда jarFile будет содержать имя своего кувшина. Обратите внимание, что если класс не загружен из файла jar, то третья строка не будет выполнена, так как path.indexOf вернет -1.

+0

Несомненно, но это разрушает ужасно, если банка переименована. Могу ли я получить ссылку на фактический JarFile, с которого загружается мой основной класс? – CAFxX

+0

Да, вы должны иметь возможность получить это через объект classloader. –

+0

@CAFxX Я обновил свой ответ, чтобы показать, как получить имя файла jar, имеющего класс. –

 Смежные вопросы

  • Нет связанных вопросов^_^