我正在尝试获取从 Eclipse 导出的可运行 JAR 文件的编译时间。一种方法可能是获取 META-INF/MANIFEST.MF 文件的修改时间。不幸的是,我似乎无法找到获取此信息的方法(我知道如何使用 读取清单本身getResourceAsStream("/META-INF/MANIFEST.MF")
,但我似乎无法读取其修改时间)。
有没有人知道如何做到这一点?
我正在尝试获取从 Eclipse 导出的可运行 JAR 文件的编译时间。一种方法可能是获取 META-INF/MANIFEST.MF 文件的修改时间。不幸的是,我似乎无法找到获取此信息的方法(我知道如何使用 读取清单本身getResourceAsStream("/META-INF/MANIFEST.MF")
,但我似乎无法读取其修改时间)。
有没有人知道如何做到这一点?
如果您可以访问 jar 文件本身,您应该能够使用java.util.jar
package 读取 jar 文件,然后获取ZipEntry
Manifest 文件并使用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。
最后,基于 Aleks G 的回答和其他地方发现的其他人,我想出了一个更强大的解决方案(例如也适用于网络共享):
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 对象到资源名称,但我想这将不得不这样做。