我想獲取從Eclipse導出的可運行JAR文件的編譯時間。一種方法可能是獲取META-INF/MANIFEST.MF文件的修改時間。不幸的是,我似乎無法找到獲取這些信息的方法(我知道如何使用getResourceAsStream("/META-INF/MANIFEST.MF")
來閱讀清單本身,但我似乎無法讀取它的修改時間)。獲取JAR編譯時間
有沒有人對如何做到這一點有所瞭解?
我想獲取從Eclipse導出的可運行JAR文件的編譯時間。一種方法可能是獲取META-INF/MANIFEST.MF文件的修改時間。不幸的是,我似乎無法找到獲取這些信息的方法(我知道如何使用getResourceAsStream("/META-INF/MANIFEST.MF")
來閱讀清單本身,但我似乎無法讀取它的修改時間)。獲取JAR編譯時間
有沒有人對如何做到這一點有所瞭解?
最後,基於阿萊克斯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;
}
}
我希望有一個更好的辦法從Class對象到資源名稱,但我想這將不得不做。
如果您有權訪問jar文件本身,您應該能夠使用java.util.jar
包讀取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的路徑名。請注意,如果該類未從jar文件加載,則第三行將失敗,因爲path.indexOf
將返回-1。
當然,但如果jar被重命名,這會突然崩潰。我是否可以獲得對正在加載的實際JarFile的引用? – CAFxX 2012-03-29 14:57:50
是的,你應該可以通過類加載器對象來獲取它。 – 2012-03-29 14:58:32
@CAFxX我更新了我的答案,以顯示如何獲取具有該類的jar文件的名稱。 – 2012-03-29 15:03:39