获取JAR编译时间

CAF*_*FxX 7 java jar manifest.mf compilation-time

我试图获取从Eclipse导出的可运行JAR文件的编译时间.一种方法可能是获取META-INF/MANIFEST.MF文件的修改时间.不幸的是,我似乎无法找到一种方式来获得这些信息(我知道如何使用阅读清单本身getResourceAsStream("/META-INF/MANIFEST.MF"),但我似乎无法能够读取其修改时间).

有没有人知道如何做到这一点?

Ale*_*s G 7

如果您可以访问jar文件本身,您应该能够使用java.util.jar包读取jar文件,然后获取ZipEntryManifest文件并使用getTime()它来获取其上次更新时间.

JarFile jf = new JarFile("myfile.jar");
ZipEntry manifest = jf.getEntry("META-INF/MANIFEST.MF");
long manifestTime = manifest.getTime();  //in standard millis
Run Code Online (Sandbox Code Playgroud)

如果您需要处理特定的类,那么您可能会发现此代码也很有用;

String rn = this.getClass().getName().replace('.', '/') + ".class";
String path = getClass().getClassLoader().getResource(rn).getPath();
String jarFile = path.substring(0, path.indexOf("!"));
Run Code Online (Sandbox Code Playgroud)

然后jarFile将包含jar的路径名.请注意,如果未从jar文件加载类,则第三行将失败,因为path.indexOf将返回-1.


CAF*_*FxX 5

最后,基于 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望有更好的方法从 Class 对象转到资源名称,但我想这将不得不这样做。