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");
千淘萬漉雖辛苦,吹盡狂沙始到金。
——劉禹錫《浪淘沙詞九首·其九》
一路走來,一路總結。最後留下的,是小本本中記錄的代碼模版與最佳實踐。