【发布时间】:2017-02-01 01:21:51
【问题描述】:
作为构建过程的一部分,我正在对已部署的 .jar 文件(通过 JNLP 部署)进行时间戳记和签名。我正在做错误日志记录,并希望包含 .jar 文件中的时间戳,以准确确认错误来自哪个签名版本。
如何从正在运行的 .jar 中访问该时间戳?
【问题讨论】:
作为构建过程的一部分,我正在对已部署的 .jar 文件(通过 JNLP 部署)进行时间戳记和签名。我正在做错误日志记录,并希望包含 .jar 文件中的时间戳,以准确确认错误来自哪个签名版本。
如何从正在运行的 .jar 中访问该时间戳?
【问题讨论】:
我正在借鉴类似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
【讨论】:
keytool -printcert -jarfile myApp.jar keytool.exe 在 JRE 中可用