亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

解決SpringBoot jar包中的文件讀取問題實現

瀏覽:2日期:2023-04-30 09:32:48

前言

SpringBoot微服務已成為業(yè)界主流,從開發(fā)到部署都非常省時省力,但是最近小明開發(fā)時遇到一個問題:在代碼中讀取資源文件(比如word文檔、導出模版等),本地開發(fā)時可以正常讀取 ,但是,當我們打成jar包發(fā)布到服務器后,再次執(zhí)行程序時就會拋出找不到文件的異常。

背景

這個問題是在一次使用freemarker模版引擎導出word報告時發(fā)現的。大概說一下docx導出java實現思路:導出word的文檔格式為docx,事先準備好一個排好版的docx文檔作為模版,讀取解析該模版,將其中的靜態(tài)資源替換再導出。

docx文檔本身其實是一個壓縮的zip文件,將其解壓過后就會發(fā)現它有自己的目錄結構。

問題

這個docx文檔所在目錄如下圖所示:

解決SpringBoot jar包中的文件讀取問題實現

在本地調試時,我使用如下方式讀取:

import org.springframework.util.ResourceUtils; public static void main(String[] args) throws IOException {File docxTemplate = ResourceUtils.getFile('classpath:templates/docxTemplate.docx'); }

可以正常解析使用,但是打包發(fā)布到beta環(huán)境卻不可用。拋出異常如下:

java.io.FileNotFoundException: class path resource [templates/docxTemplate.docx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/usr/local/subject-server.jar!/BOOT-INF/classes!/templates/docxTemplate.docx

顯而易見,這個異常告訴我們:沒有找到文件,但是將jar包解壓過后,發(fā)現這個文件是真真實實存在的。那這到底是怎么回事呢?這壓根難不倒我。我們要善于透過堆棧信息看本質。通過仔細觀察堆棧信息,我發(fā)現此時的文件路徑并不是一個合法的URL(文件資源定位符)。原來jar包中資源有其專門的URL形式: jar:<url>!/{entry} )。所以,此時如果仍然按照標準的文件資源定位形式

File f=new File('jar:file:……');

定位文件,就會拋出java.io.FileNotFoundException。

解決

雖然我們不能用常規(guī)操作文件的方法來讀取jar包中的資源文件docxTemplate.docx,但可以通過Class類的getResourceAsStream()方法,即通過流的方式來獲取 :

public static void main(String[] args) throws IOException {InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream('templates/docxTemplate.docx'); }

拿到流之后,就可以將其轉換為任意一個我們需要的對象,比如File、String等等,此處我要獲取docxTemplate.docx下的目錄結構,因此我需要一個File對象,代碼舉例如下:

import org.apache.commons.io.FileUtils; public static void main(String[] args) throws IOException { InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream('templates/docxTemplate.docx'); File docxFile = new File('docxTemplate.docx'); // 使用common-io的工具類即可轉換 FileUtils.copyToFile(inputStream,docxFile); ZipFile zipFile = new ZipFile(docxFile); Enumeration<? extends ZipEntry> zipEntrys = zipFile.entries(); // todo 記得關閉流 }

結果

打包、發(fā)布至beta環(huán)境,親測可用,問題完美解決。

到此這篇關于解決SpringBoot jar包中的文件讀取問題實現的文章就介紹到這了,更多相關SpringBoot jar包文件讀取內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 久操青青 | 免费一级毛片免费播放 | 久久久久青草线蕉亚洲麻豆 | 国产网站麻豆精品视频 | 欧美 国产 日本 | 久国产视频 | 性色视频免费 | 激情综合色五月丁香六月亚洲 | 国产色秀视频在线观看 | 精品国精品国产自在久国产不卡 | 男女啪啪免费观看网站 | 亚洲欧美另类国产综合 | 亚洲国产精品一区二区九九 | 青青影院一区二区免费视频 | 国产成本人三级在线观看网站 | 亚洲男女免费视频 | 免费看黄色三级毛片 | 欧美欧美欧美 | 午夜性色一区二区三区不卡视频 | 国内精品福利在线视频 | 99久久精品国产综合一区 | 人与牲动交xxxxbbbb高清 | 91亚洲精品福利在线播放 | 国产白拍| 久草国产精品视频 | 欧美性色xo影院69 | 动漫chinesehdxxxx| 性性影院在线观看 | 欧美经典成人在观看线视频 | 亚洲国产一区在线 | 日本在线日本中文字幕日本在线视频播放 | 看日本真人一一级特黄毛片 | 国产精品第一页第一页 | 亚洲四区 | 青草娱乐极品免费视频 | 日韩毛片高清在线看 | 99在线精品国产不卡在线观看 | 丁香婷婷久久大综合 | 91av视频在线观看 | 久久99精品久久久久久黑人 | 日韩电影中文字幕在线网站 |