SpringBoot微服務已成為業界主流,從開發到部署都非常省時省力,但是最近小明開發時遇到一個問題:在代碼中讀取資源檔案(比如word文檔、導出模版等),本地開發時可以正常讀取 ,但是,當我們打成jar包釋出到伺服器後,再次執行程式時就會抛出找不到檔案的異常。
這個問題是在一次使用freemarker模版引擎導出word報告時發現的。大概說一下docx導出java實作思路:導出word的文檔格式為docx,事先準備好一個排好版的docx文檔作為模版,讀取解析該模版,将其中的靜态資源替換再導出。
docx文檔本身其實是一個壓縮的zip檔案,将其解壓過後就會發現它有自己的目錄結構。
這個docx文檔所在目錄如下圖所示:

在本地調試時,我使用如下方式讀取:
可以正常解析使用,但是打包釋出到beta環境卻不可用。抛出異常如下:
顯而易見,這個異常告訴我們:沒有找到檔案,但是将jar包解壓過後,發現這個檔案是真真實實存在的。
那這到底是怎麼回事呢?這壓根難不倒我。我們要善于透過堆棧資訊看本質。通過仔細觀察堆棧資訊,我發現此時的檔案路徑并不是一個合法的URL(檔案資源定位符)。原來jar包中資源有其專門的URL形式: jar:!/{entry} )。是以,此時如果仍然按照标準的檔案資源定位形式
定位檔案,就會抛出java.io.FileNotFoundException。
雖然我們不能用正常操作檔案的方法來讀取jar包中的資源檔案docxTemplate.docx,但可以通過Class類的getResourceAsStream()方法,即通過流的方式來擷取 :
拿到流之後,就可以将其轉換為任意一個我們需要的對象,比如File、String等等,此處我要擷取docxTemplate.docx下的目錄結構,是以我需要一個File對象,代碼舉例如下:
打包、釋出至beta環境,親測可用,問題完美解決。
本文可轉載,但需聲明原文出處。 程式員小明,一個很少加班的程式員。歡迎關注微信公衆号,擷取更多優質文章。