@Override
public void run(ApplicationArguments args) throws Exception {
// 相对路径resources资源目录
String resourcePath = getClass().getClassLoader().getResource("").getPath();
// 去掉多余的斜杠
if (resourcePath.startsWith("/")) {
resourcePath = resourcePath.substring(1);
}
//证书地址
InputStream liceseInputStream = this.getClass().getClassLoader().getResourceAsStream("license/license.lic");
File licenseFile =new File( resourcePath + "license.lic");
FileUtils.copyInputStreamToFile(liceseInputStream,licenseFile);
param.setLicensePath(resourcePath + "license.lic");
// 公钥地址
InputStream publicCertsInputStream = this.getClass().getClassLoader().getResourceAsStream("license/publicCerts.keystore");
File publicCertsFile =new File( resourcePath + "publicCerts.keystore");
FileUtils.copyInputStreamToFile(publicCertsInputStream,publicCertsFile);
param.setPublicKeysStorePath(resourcePath + "publicCerts.keystore");
}
我项目的目录,文件分布情况:
1、
String resourcePath = getClass().getClassLoader().getResource("").getPath();
结果为:/D:/workspace/IdeaProjects/szjdc-service/sz-warning-platform/target/classes/
getClass():获取字节码文件对象
getClassLoader():获取类加载器
getResource(""):资源名称:"",方法返回该资源的路径【这个方法后面会具体说明】
返回:file:/D:/workspace/IdeaProjects/szjdc-service/sz-warning-platform/target/classes/
2、
resourcePath 去掉前面的斜杠之后:
D:/workspace/IdeaProjects/szjdc-service/sz-warning-platform/target/classes/
3、找到证书的输入流
InputStream liceseInputStream =
this.getClass().getClassLoader().getResourceAsStream("license/license.lic");
getResourceAsStream()底层调用了 getResource(),下面是关于这个方法的解释
该方法首先在父类加载器中搜索该资源;
如果父级为null,则搜索虚拟机内置的类加载器的路径。
如果失败,这个方法将调用findResource(String)来查找资源。
参数:name–资源名称
返回:用于读取资源的URL对象,或者如果找不到资源或者调用程序没有足够的特权来获取资源,则为null。
getResourceAsStream()用于读取 getResource()找到的资源的输入流
上面我们找到了证书的位置,并且获取了输入流,下面我们需要将该证书拷贝到项目的根目录中
4、将证书拷贝到项目中
File licenseFile =new File( resourcePath + "license.lic");
创建 File 对象,表示文件路径为:D:/workspace/IdeaProjects/szjdc-service/sz-warning-platform/target/classes/license.lic
FileUtils.copyInputStreamToFile(liceseInputStream,licenseFile);
拷贝文件,将 liceseInputStream 拷贝到 licenseFile
5、公钥资源查找
InputStream publicCertsInputStream = this.getClass().getClassLoader().getResourceAsStream("license/publicCerts.keystore");
公钥放在common模块内部,不在platform模块里面
getResource()找到资源路径返回,getResourceAsStream()将资源转化为输入流