2012-03-29 176 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