Получить JAR время компиляции

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

Кто-нибудь знает, как это сделать?

2 ответа

Решение

В конце, основываясь на ответе Алекса Г. и других, найденных где-то еще, я придумал более надежное решение (которое, например, работает и для сетевых ресурсов):

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

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

Если у вас есть доступ к самому файлу JAR, вы сможете прочитать файл JAR, используя 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.

Другие вопросы по тегам