Alice
上线后,学生导入模版文件下载失败。java
未打包是没问题的,打完包后就发生了错误。开始逐步定位问题。spring
File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "static/导入学生模板.xlsx"); InputStream inputStream = new FileInputStream(file); Workbook workbook = new XSSFWorkbook(inputStream);
经测试,问题出在ResourceUtils.getFile
这个方法上。app
ResourceUtils.CLASSPATH_URL_PREFIX + "static/导入学生模板.xlsx"
字符串拼接后就是classpath:static/导入学生模板.xlsx
,没打包时,该方法能正常获取到该Excel
文件。spring-boot
ResourceUtils.getFile
是获取磁盘上的文件,而打完包以后,resources
目录了下的全部资源都被打进了jar
包,因此不存在相应的Excel
文件,获取的时候就报错了。找不到文件。测试
将打好的jar
包解压,主要的东西都在BOOT-INF
里。META-INF
里面有pom.xml
,应该是存储项目信息的。org
目录内是springframework
的一些class
字节码。this
BOOT-INF
内就是本项目的核心代码与第三方库。spa
classes
目录下就是本项目的核心代码,咱们的Excel
就在这里面。code
lib
目录下是项目中引用的第三方jar
包,里面有咱们经常使用的slf4j
,spring-boot
等jar
包。xml
因此,Spring Boot
的项目通常都较大,有一部分缘由是把许多第三方包都打包进去了。对象
@Autowired
一个ResourceLoader
,而后调用getResource
方法,加载资源。
想一想也不难理解,SpringBoot
启动时读取application.yml
配置,Spring
的源码中就是使用ResourceLoader
实现的。
只不过源码中直接用的上下文对象,一个上下文对象不仅是一个IOC
容器,仍是一个资源加载器。(上下文其实有不少的功能,能够点开Spring
源码看一看,颇有意思。)
ResourcePatternResolver
派生自ResourceLoader
接口。
代码模版,之后读取文件就这样写,啥毛病没有:
Resource resource = this.resourceLoader.getResource(ResourceUtils.CLASSPATH_URL_PREFIX + "static/导入学生模板.xlsx");
千淘万漉虽辛苦,吹尽狂沙始到金。
——刘禹锡《浪淘沙词九首·其九》
一路走来,一路总结。最后留下的,是小本本中记录的代码模版与最佳实践。