2012-03-29 144 views
5

我想獲取從Eclipse導出的可運行JAR文件的編譯時間。一種方法可能是獲取META-INF/MANIFEST.MF文件的修改時間。不幸的是,我似乎無法找到獲取這些信息的方法(我知道如何使用getResourceAsStream("/META-INF/MANIFEST.MF")來閱讀清單本身,但我似乎無法讀取它的修改時間)。獲取JAR編譯時間

有沒有人對如何做到這一點有所瞭解?

回答

3

最後,基於阿萊克斯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對象到資源名稱,但我想這將不得不做。

7

如果您有權訪問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。

+0

當然,但如果jar被重命名,這會突然崩潰。我是否可以獲得對正在加載的實際JarFile的引用? – CAFxX 2012-03-29 14:57:50

+0

是的,你應該可以通過類加載器對象來獲取它。 – 2012-03-29 14:58:32

+0

@CAFxX我更新了我的答案,以顯示如何獲取具有該類的jar文件的名稱。 – 2012-03-29 15:03:39