【问题标题】:How do I retrieve a .jar timestamp?如何检索 .jar 时间戳?
【发布时间】:2017-02-01 01:21:51
【问题描述】:

作为构建过程的一部分,我正在对已部署的 .jar 文件(通过 JNLP 部署)进行时间戳记和签名。我正在做错误日志记录,并希望包含 .jar 文件中的时间戳,以准确确认错误来自哪个签名版本。

如何从正在运行的 .jar 中访问该时间戳?

【问题讨论】:

    标签: java timestamp


    【解决方案1】:

    我正在借鉴类似question 的答案。

    您似乎可以通过以下方式获取 jar 文件的位置:

    public class ClassFileHelper {
        public static URL getClassURL(Class<?> clazz) {
            return clazz.getResource('/' + clazz.getName().replace('.', '/') + ".class");
        }
    
        public static String getJARFromURL(URL url) {
            if (!url.getProtocol().equals("jar"))
                return null;
            String fileName = url.getFile();
            fileName = fileName.substring(0, fileName.lastIndexOf('!'));
            fileName = fileName.substring(fileName.lastIndexOf('/') + 1);
            return fileName;
        }
    }
    
    Class clazz = MyClass.class;
    URL classURL = ClassFileHelper.getClassURL(clazz);
    
    String jarFile = ClassFileHelper.getJARFromURL(classURL));
    

    然后为了获得签名的时间戳,我再次从问题 here 中复制了一些其他答案 - 请原谅我的有罪不罚!

    File f = new File( jarFile );

    if ( f.exists() ) ->

    使用Runtime.exec(...) 执行命令jarsigner -verify -verbose -certs myjar.jar - 确保将jarsigner 的正确位置传递给参数。

    解析[entry was signed on 8/2/13 3:48 PM]形式的输出以获取时间戳。

    另一种选择是在 JRE 中使用keytool

    keytool -printcert -jarfile myApp.jar

    【讨论】:

    • 您返回的是文件上的操作系统时间戳,而不是 jar 文件中的签名时间戳。
    • 很遗憾,jarsigner.exe 是 JDK 的一部分,无法在只有 JRE 的客户端计算机上使用。
    • @BrianKnoblauch 似乎还有一个选项可以获取 jar 文件的证书:keytool -printcert -jarfile myApp.jar keytool.exe 在 JRE 中可用
    • 如果时间戳在 printcert 打印输出中,我只是没有看到它。也不喜欢 shell 调用可能在用户路径中也可能不在用户路径中的工具。必须有一种体面的程序化方式来做到这一点。
    猜你喜欢
    • 2015-10-15
    • 2022-11-20
    • 2012-05-07
    • 1970-01-01
    • 2020-04-08
    • 2020-04-09
    • 1970-01-01
    • 2011-09-28
    • 2015-07-27
    相关资源
    最近更新 更多