引言
Alice上線后,學生導入模版文件下載失敗。
未打包是沒問題的,打完包后就發生了錯誤。開始逐步定位問題。
原方法
java讀取當前路徑下的文件。File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx");
InputStream inputStream = new FileInputStream(file);
Workbook workbook = new XSSFWorkbook(inputStream);
經測試,問題出在ResourceUtils.getFile這個方法上。
ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx"
springboot獲得相對路徑,字符串拼接后就是classpath:static/導入學生模板.xlsx,沒打包時,該方法能正常獲取到該Excel文件。
ResourceUtils.getFile是獲取磁盤上的文件,而打完包之后,resources目錄了下的所有資源都被打進了jar包,所以不存在相應的Excel文件,獲取的時候就報錯了。找不到文件。
測試
將打好的jar包解壓,主要的東西都在BOOT-INF里。META-INF里面有pom.xml,應該是存儲項目信息的。org目錄內是springframework的一些class字節碼。
BOOT-INF內就是本項目的核心代碼與第三方庫。
dockerfile詳解、classes目錄下就是本項目的核心代碼,我們的Excel就在這里面。
lib目錄下是項目中引用的第三方jar包,里面有我們常用的slf4j,spring-boot等jar包。
所以,Spring Boot的項目一般都較大,有一部分原因是把許多第三方包都打包進去了。
解決方案
@Autowired一個ResourceLoader,然后調用getResource方法,加載資源。
docker執行容器內的shell、想想也不難理解,SpringBoot啟動時讀取application.yml配置,Spring的源碼中就是使用ResourceLoader實現的。
只不過源碼中直接用的上下文對象,一個上下文對象不只是一個IOC容器,還是一個資源加載器。(上下文其實有很多的功能,可以點開Spring源碼看一看,很有意思。)
ResourcePatternResolver派生自ResourceLoader接口。
代碼模版,以后讀取文件就這樣寫,啥毛病沒有:
Resource resource = this.resourceLoader.getResource(ResourceUtils.CLASSPATH_URL_PREFIX + "static/導入學生模板.xlsx");
docker讀取外部文件,總結
千淘萬漉雖辛苦,吹盡狂沙始到金。
——劉禹錫《浪淘沙詞九首·其九》
一路走來,一路總結。最后留下的,是小本本中記錄的代碼模版與最佳實踐。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态