作为构建过程的一部分,我正在对已部署的.jar文件(通过 JNLP 部署)进行时间戳和签名。 我正在进行错误日志记录,并希望包含.jar文件中的时间戳,以准确确认错误来自哪个签名版本。
如何从正在运行的.jar内部访问该时间戳?
我正在从类似的问题中得出答案。
似乎您可以通过以下方式获取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));
然后为了获得签名的时间戳,我再次从这里的一个问题中复制一些其他答案 - 请原谅我逍遥法外!
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