发生的情况: 线上项目CFCA签章需要一个类似安全证书文件路径,在本地只需要获取弄个静态变量path="D:/*******"就可以,但是线上就需要从项目路径下找到这个安全证书的位置.用下面的方法会报空指针异常
private static String path = null;
static{
path = GetStaticPath.class.getClass().getResource("").getPath();
}
下面的方法也是异常
private static String path = null;static{
path = Thread.currentThread().getContextClassLoader().getResource("/").getPath();
}
下面的方法不会异常
private static String path = null;
static{
path = GetStaticPath.class.getResource("").getPath();
}
输出:/D:/007workspace/learning/bin/learning/
个人觉得原因是:.class取类的字节码文件,getClass从类的实例对象取类的字节码文件,类加载时还没有初始化完毕,所以这时候取到得对象为空,Thread.currentThread()取到得对象也为空.
但是上面的方法.class虽然能取到文件的路径,在线上项目就不行了,所以内部类就管用了,参考(https://my.oschina.net/u/572362/blog/865067)
所以新的方法是
public static String JKS_PATH = null;static {
String path = new Object() {
public String getPath() {
return this.getClass().getResource("/").getPath();
}
}.getPath().substring(1);
path=path.replace("classes", "vm"); //去掉class\
path+="/anxinsign.jks";
JKS_PATH = path;
}
OJBK,没有问题!!!