跳到主要内容

Springboot项目打成Jar包后在服务器上读取Resource下文件

·398 字·1 分钟

SpringBoot项目读取resource下文件,使用File路径读取只在本地好用,打成jar包后部署在服务器上,报空指针找不到文件;必须使用流的方式读取才能保证本地开发环境与部署jar环境都好用

最近在使用poi-tl导出word的一个功能中,需要对word模板进行读取,遂将word模板文件放到resource下,使用下面方法进行读取:

String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
        XWPFTemplate template = XWPFTemplate.compile(path+"/file/bweam.docx",config)
                .render(data);
        try (OutputStream os = response.getOutputStream();
             BufferedOutputStream bos = new BufferedOutputStream(os);){
            template.write(bos);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            PoitlIOUtils.closeQuietlyMulti(template);
        }

这种写法在本地运行没什么问题,但是达成jar包放到服务器上就读不到这个文件了。应该采用以下方式进行编写:

ClassPathResource classPathResource = new ClassPathResource("file/bweam.docx");
        InputStream inputStream = null;
        try {
            inputStream = classPathResource.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        XWPFTemplate template = XWPFTemplate.compile(inputStream,config)
                .render(data);

        try (OutputStream os = response.getOutputStream();
             BufferedOutputStream bos = new BufferedOutputStream(os);){
            template.write(bos);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            PoitlIOUtils.closeQuietlyMulti(template);
        }

注:

不管是用ClassPathResource还是ClassLoader,读取jar里面的文件,我们只能用流去读取,不能用file,文件肯定要牵扯路径。

BufferedReader in = new BufferedReader(new InputStreamReader(AuditConstant.class.getClassLoader().getResourceAsStream("xxx"));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = in.readLine() != null){
    buffer.append(line);
}