Spring Boot Jar包运行加载静态资源文件
2017-7-21
| 2023-6-6
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
标签

需求场景

有时候我们需要在项目中使用一些静态资源文件,比如在导出Excel表格数据时需要读取Excel模板,在导出时先读取Excel模板再把内容填充进去。
Excel模板文件template.xls放在/src/resources/excel-templat/目录下。

简单普通的方式

使用SpringResourceUtils类实现:
public static FileInputStream getExcelTemplates() throws FileNotFoundException { return new FileInputStream(ResourceUtils.getFile("classpath:excel-templates/template.xls")); }
此种方式在开发环境直接用spring-boot:run方式完美运行。
但在打成Jar包以java -jar方式或者是War包时运行时会报FileNotFoundException异常。

原因

网上查了发现ResourceUtils是以文件目录的形式来获取文件的,但jar包是一个单独的文件而非文件夹,绝对不可能通file:/e:/.../**.jar/excel-template/template.xls这种形式的文件URL来定位template.xls。所以即使是相对路径,也无法定位到jar文件内的资源文件。

解决

对于Jar包的资源文件不能以文件的形式来读取,只能以流的方式读取。
public static InputStream getExcelTemplates() throws IOException { PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); Resource[] resources = patternResolver.getResources("excel-template/template.xls"); if (resources != null && resources.length > 0) { return resources[0].getInputStream(); } else { logger.error("file: excel-template/template.xls not found." ); return null; } }
SpringBoot
  • Java
  • SpringBoot
  • Spring Boot 采用自定义注解方式实现AOP日志记录Prometheus安装文档
    目录