Bootstrap

getClass()getClassLoader()getResourceAsStream()getResource()方法的理解

@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()将资源转化为输入流

;