Springboot獲取jar包中resources資源目錄下的文件
阿薩斯多問題現(xiàn)象:
今天在項目中遇到一個業(yè)務(wù)場景,需要用到resources資源目錄下的文件,然后就在思考一個問題:
當(dāng)項目打成jar后,Springboot要如何獲取resources資源目錄下的文件呢?
問題分析:
如題,如何在項目打成jar包之后,在代碼中依然能夠獲取到j(luò)ar包中resources資源目錄下的文件呢?
我們都知道其實(shí)要獲取resources資源目錄下的文件,有非常多的方法;這些方法雖然能在正常的debug本地運(yùn)行項目時有效,但在項目打成jar包運(yùn)行時,卻并非都是有效的了?。。?/p>
因此,在這里我打算記錄一個親測可行的方法。
首先,展示一下我的項目結(jié)構(gòu),如圖我在resources資源目錄下創(chuàng)建了一個文件夾rules,然后在其中創(chuàng)建了3個drl文件:

由于代碼邏輯非常簡單,所以這里直接通過啟動類來測試了。
ResourceDemoApplication:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import java.io.File;
import java.io.IOException;
/**
* resource資源目錄專題
* @author Stephen
*/
@SpringBootApplication
public class ResourceDemoApplication {
public static void main(String[] args) {
// SpringApplication.run(ResourceDemoApplication.class, args);
try {
//如何獲取resource下的文件?【注意:即使打成jar包也得有效】
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resourcePatternResolver.getResources("classpath*:rules/**/*.*");
for ( Resource resource : resources ) {
//獲取文件名
System.out.println(resource.getFilename());
//獲取文件,該方式在打成jar包后會報錯,因?yàn)閞esource文件不在系統(tǒng)中,而是在jar包中
File file1 = resource.getFile();
//獲取文件,在打成jar包后,通過url來獲取文件,則路徑是正確的
File file = new File(resource.getURL().getFile());
//獲取文件絕對路徑,但路徑有問題,因?yàn)閞esource文件不在系統(tǒng)中,而是在jar包中
// System.out.println(file.getAbsolutePath());
//獲取文件名
System.out.println(file.getName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}接下來展示的是運(yùn)行結(jié)果。
首先是本地項目:

可以看到,非常順利的打印出了文件名。
然后是jar包運(yùn)行:

同樣沒問題。
注意:
需要注意的是:在 ResourceDemoApplication 啟動類中,有兩行被注釋掉的代碼:

上面這行代碼在本地運(yùn)行是沒問題的,但打成jar包運(yùn)行時會出現(xiàn)如下報錯,所以不建議使用:

顯示的文件路徑是:
jar:file:/C:/Users/Administrator/Desktop/resource_demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/rules/comparison-rules.drl
可以看到 resource_demo-0.0.1-SNAPSHOT.jar 后面跟了一個 ! 然后才是對應(yīng)drl文件target包中的路徑,這個細(xì)節(jié)我沒有深究,但單從這個暴多的文件路徑來分析的話,我的理解就是,這個文件路徑其實(shí)是個偽路徑,它不是文件真實(shí)的url地址,所以通過resource對象無法獲取到文件。
另一行注釋的代碼是:

執(zhí)行這行代碼,即使在jar包運(yùn)行時,也不會報錯,只是在jar包運(yùn)行時,打印的文件絕對路徑并不是真實(shí)的路徑,也就是系統(tǒng)無法識別,因?yàn)檫@個文件在jar包內(nèi)部,路徑如下:

如有擴(kuò)展,后續(xù)將會補(bǔ)充。
解決方法:
try {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resourcePatternResolver.getResources("classpath*:rules/**/*.*");
for ( Resource resource : resources ) {
//獲取文件,在打成jar包后,通過url來獲取文件,則路徑是正確的
File file = new File(resource.getURL().getFile());
}
} catch (IOException e) {
e.printStackTrace();
}到此這篇關(guān)于Springboot獲取jar包中resources資源目錄下的文件的文章就介紹到這了,更多相關(guān)Springboot獲取resources文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot 項目讀取Resources目錄下的文件(推薦)
- 解決springboot項目找不到resources目錄下的資源問題
- 解決@springboottest注解無法加載src/main/resources目錄下文件
- springboot項目讀取resources目錄下的文件的9種方式
- springboot實(shí)現(xiàn)jar運(yùn)行復(fù)制resources文件到指定的目錄(思路詳解)
- SpringBoot中讀取jar包中的resources目錄下的文件的三種方式
- SpringBoot如何讀取resources目錄下的文件
- SpringBoot實(shí)現(xiàn)本地上傳文件到resources目錄
- Springboot項目啟動不加載resources目錄下的文件問題
- SpringBoot下獲取resources目錄下文件的常用方法
相關(guān)文章
springboot集成spark并使用spark-sql的示例詳解
這篇文章主要介紹了spring-boot集成spark并使用spark-sql的方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
Spring AbstractRoutingDatasource 動態(tài)數(shù)據(jù)源的實(shí)例講解
本文介紹如何使用 Spring AbstractRoutingDatasource 基于上下文動態(tài)切換數(shù)據(jù)源,因此我們會讓查找數(shù)據(jù)源邏輯獨(dú)立于數(shù)據(jù)訪問之外2021-07-07
淺談Java中的n種隨機(jī)數(shù)產(chǎn)生辦法
眾所周知,隨機(jī)數(shù)是任何一種編程語言最基本的特征之一。而生成隨機(jī)數(shù)的基本方式也是相同的:產(chǎn)生一個0到1之間的隨機(jī)數(shù)。看似簡單,但有時我們也會忽略了一些有趣的功能。2015-09-09
Spring中的NamespaceHandler接口及相關(guān)軟件包說明
這篇文章主要介紹了Spring中的NamespaceHandler接口及相關(guān)軟件包說明,NamespaceHandler 接口,DefaultBeanDefinitionDocumentReader 使用該接口來處理在spring xml 配置文件中自定義的命名空間,需要的朋友可以參考下2023-12-12
java比較器Comparable接口與Comaprator接口的深入分析
本篇文章是對java比較器Comparable接口與Comaprator接口進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
MyBatis常用的jdbcType數(shù)據(jù)類型
這篇文章主要介紹了MyBatis常用的jdbcType數(shù)據(jù)類型的相關(guān)資料,需要的朋友可以參考下2016-12-12
基于Java SSM實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng)
本項目基于Java SSM框架實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng),主要實(shí)現(xiàn)系統(tǒng)的在線點(diǎn)餐功能。文中的示例代碼講解詳細(xì),感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-02-02

