Получить 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.