使用springboot打包后的文件讀取方式
springboot打包后的文件讀取
在使用了springboot打包后的項(xiàng)目中,牽扯到項(xiàng)目目錄中文件讀取工作時(shí),明明在開發(fā)時(shí)功能正常,但是一到發(fā)布到線上環(huán)境就會(huì)報(bào)文件找不到,路徑不存在的問題。
由于在開發(fā)過程中,文件就在我們本地目錄中存在,因此普通正常文件的讀寫功能不受影響,而一旦打包后,可能會(huì)由于我們自己的文件目錄放置原因一是沒有被正確打包到j(luò)ar包中,第二個(gè)即使被打包進(jìn)去,由于jar包并不會(huì)解壓到服務(wù)器中,因此如果我們按照正常的文件路徑去獲取文件的時(shí)候還是會(huì)報(bào)異常。
文件打包問題
首先是確認(rèn)我們自己的文件有沒有被打包到j(luò)ar包中,默認(rèn)的如果文件在src/main/resources目錄下的時(shí)候是會(huì)打包的,但如果不在目錄中,我們可以通過在pom.xml中配置以下指明我們的資源文件所在。拿個(gè)mybatis的mapper.xml文件舉例,我們將沒有放到了java源碼目錄中了,則需要通過以下配置指定目錄所在
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
文件讀取問題
記住一個(gè)準(zhǔn)則,凡是要通過路徑獲取文件的方法都會(huì)報(bào)錯(cuò),但是通過流的方式卻是可以工作的。我們拿spring提供的一個(gè)類org.springframework.core.io.ClassPathResource來解決讀取問題。
ClassPathResource classPathResource = new ClassPathResource(path); InputStream inputStream = classPathResource.getInputStream(); // 流獲取到了就可以做自己想要的讀取操作了
但是還有一些情況,我們就是要獲取文件然后做一些操作,比如我需要通過文件構(gòu)造RandomAccessFile對(duì)象然后來實(shí)現(xiàn)某些功能,當(dāng)然我目前還沒發(fā)現(xiàn)通過流來構(gòu)造這個(gè)對(duì)象的,所以不知道還有沒有別的方法。
這種情況先獲取到流然后重新生成一個(gè)新的文件,然后我們最終讀取的是我們復(fù)制的那個(gè)文件,而不對(duì)原始文件操作,這樣這個(gè)文件就是在真實(shí)路徑中存在的。舉個(gè)簡單的代碼例子,我們?cè)趕rc/main/resources下有一個(gè)test.txt文件,我們可以在要讀取文件(要保證只執(zhí)行一次)或者簡單粗暴在項(xiàng)目啟動(dòng)的時(shí)候復(fù)制一下文件。
String path = "test.txt"; ClassPathResource classPathResource = new ClassPathResource(path); // 我們要將文件復(fù)制到服務(wù)器的某個(gè)目錄 String targetPath = "/app/file/test.txt"; // 通過原始文件流復(fù)制文件 Files.copy(classPathResource.getInputStream(), Paths.get(targetPath ), StandardCopyOption.REPLACE_EXISTING); // 然后通過復(fù)制的文件進(jìn)行操作 new RandomAccessFile(targetPath, "r");
Springboot打包后讀取不到文件
SpringBoot部署后文件找不到的問題
項(xiàng)目引用了一個(gè)xml作為模板

本地訪問文件的時(shí)候使用的方式比較直接
Document document = reader.read(ResourceUtils.getURL("classpath:").getPath() + "xmlTemplate.xml");
直接訪問classpath下的xmlTemplate,這種方式在本地運(yùn)行的時(shí)候能取到文件,但是項(xiàng)目在打包再發(fā)布以后,問題就出來了…

解決辦法1 失敗。。
在pom中的build中 直接配置resources
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
這個(gè)配置的作用是告訴maven哪些文件需要被打進(jìn)包里。這時(shí)我看了一眼打好的jar包,確實(shí)里面是有我的文件的,但是此時(shí)代碼報(bào)錯(cuò) 找不到文件。

解決辦法 2
換一種取文件的方式,因?yàn)橐呀?jīng)確定打好的包中是有文件的新的方式
ClassPathResource resource = new ClassPathResource("xmlTemplate.xml");
Document document = reader.read(resource.getInputStream());
解決了..
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java發(fā)送form-data請(qǐng)求實(shí)現(xiàn)文件上傳的示例代碼
最近做一個(gè)需求,需要請(qǐng)求第三方接口上傳文件,該請(qǐng)求類型是form-data請(qǐng)求,本文就來介紹一下java發(fā)送form-data請(qǐng)求實(shí)現(xiàn)文件上傳的示例代碼,感興趣的可以了解一下2023-12-12
利用ThreadLocal實(shí)現(xiàn)一個(gè)上下文管理組件
本文基于ThreadLocal原理,實(shí)現(xiàn)了一個(gè)上下文狀態(tài)管理組件Scope,通過開啟一個(gè)自定義的Scope,在Scope范圍內(nèi),可以通過Scope各個(gè)方法讀寫數(shù)據(jù),感興趣的可以了解一下2022-10-10
@JsonFormat?和?@DateTimeFormat?時(shí)間格式化注解(場景示例代碼)
這篇文章主要介紹了@JsonFormat和@DateTimeFormat時(shí)間格式化注解,本文通過場景示例代碼詳解給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
SpringBoot整合screw實(shí)現(xiàn)自動(dòng)生成數(shù)據(jù)庫設(shè)計(jì)文檔
使用navicat工作的話,導(dǎo)出的格式是excel不符合格式,還得自己整理。所以本文將用screw工具包,整合到springboot的項(xiàng)目中便可以自動(dòng)生成數(shù)據(jù)庫設(shè)計(jì)文檔,非常方便,下面就分享一下教程2022-11-11
java實(shí)現(xiàn)的順時(shí)針/逆時(shí)針打印矩陣操作示例
這篇文章主要介紹了java實(shí)現(xiàn)的順時(shí)針/逆時(shí)針打印矩陣操作,涉及java基于數(shù)組的矩陣存儲(chǔ)、遍歷、打印輸出等相關(guān)操作技巧,需要的朋友可以參考下2019-12-12
淺談SpringBoot之開啟數(shù)據(jù)庫遷移的FlyWay使用
這篇文章主要介紹了淺談SpringBoot之開啟數(shù)據(jù)庫遷移的FlyWay使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題及解決辦法
這篇文章主要介紹了Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題及解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
java8 多個(gè)list對(duì)象用lambda求差集操作
這篇文章主要介紹了java8 多個(gè)list對(duì)象用lambda求差集操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09

