如何獲取jar包resources文件路徑
獲取jar包resources文件路徑
java項(xiàng)目發(fā)布到j(luò)ar之后找不到文件路徑
本地: String path = this.getClass().getClassLoader().getResource(xmlPath).getPath();
打成jar發(fā)布服務(wù)器不管用了
解決辦法:
//相對(duì)路徑
private final String xmlPath= "/jenkinspipeline/PipelineConfig.xml";
public StringBuilder propertyResolverXml(String xmlPath) {
InputStream resourceAsStream = XmlLocalUtils.class.getResourceAsStream(xmlPath);//讀取內(nèi)容
StringBuilder xmlStr = new StringBuilder();
BufferedReader read = null;
try {
read = new BufferedReader(new InputStreamReader(resourceAsStream));//轉(zhuǎn)成bufferreader按行讀取
String tempStr;
while ((tempStr = read.readLine()) != null) {
xmlStr.append(tempStr);
}
read.close();
} catch (Exception ex) {
log.error("解析文件異常:", ex);
throw new NativeSphereCicdException(NativeSphereCicdEnum.PROPERTYRESOLVERXML_EXCEPTION);
}
return xmlStr;
}補(bǔ)充:
Springboot獲取jar包中resources資源目錄下的文件
阿薩斯多問(wèn)題現(xiàn)象:
今天在項(xiàng)目中遇到一個(gè)業(yè)務(wù)場(chǎng)景,需要用到resources資源目錄下的文件,然后就在思考一個(gè)問(wèn)題:
當(dāng)項(xiàng)目打成jar后,Springboot要如何獲取resources資源目錄下的文件呢?
問(wèn)題分析:
如題,如何在項(xiàng)目打成jar包之后,在代碼中依然能夠獲取到j(luò)ar包中resources資源目錄下的文件呢?
我們都知道其實(shí)要獲取resources資源目錄下的文件,有非常多的方法;這些方法雖然能在正常的debug本地運(yùn)行項(xiàng)目時(shí)有效,但在項(xiàng)目打成jar包運(yùn)行時(shí),卻并非都是有效的了!??!
因此,在這里我打算記錄一個(gè)親測(cè)可行的方法。
首先,展示一下我的項(xiàng)目結(jié)構(gòu),如圖我在resources資源目錄下創(chuàng)建了一個(gè)文件夾rules,然后在其中創(chuàng)建了3個(gè)drl文件:

由于代碼邏輯非常簡(jiǎn)單,所以這里直接通過(guò)啟動(dòng)類來(lái)測(cè)試了。
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包后會(huì)報(bào)錯(cuò),因?yàn)閞esource文件不在系統(tǒng)中,而是在jar包中
File file1 = resource.getFile();
//獲取文件,在打成jar包后,通過(guò)url來(lái)獲取文件,則路徑是正確的
File file = new File(resource.getURL().getFile());
//獲取文件絕對(duì)路徑,但路徑有問(wèn)題,因?yàn)閞esource文件不在系統(tǒng)中,而是在jar包中
// System.out.println(file.getAbsolutePath());
//獲取文件名
System.out.println(file.getName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}接下來(lái)展示的是運(yùn)行結(jié)果。
首先是本地項(xiàng)目:

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

同樣沒(méi)問(wèn)題。
注意:
需要注意的是:在 ResourceDemoApplication 啟動(dòng)類中,有兩行被注釋掉的代碼:

上面這行代碼在本地運(yùn)行是沒(méi)問(wèn)題的,但打成jar包運(yùn)行時(shí)會(huì)出現(xiàn)如下報(bào)錯(cuò),所以不建議使用:

顯示的文件路徑是:
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 后面跟了一個(gè) ! 然后才是對(duì)應(yīng)drl文件target包中的路徑,這個(gè)細(xì)節(jié)我沒(méi)有深究,但單從這個(gè)暴多的文件路徑來(lái)分析的話,我的理解就是,這個(gè)文件路徑其實(shí)是個(gè)偽路徑,它不是文件真實(shí)的url地址,所以通過(guò)resource對(duì)象無(wú)法獲取到文件。
另一行注釋的代碼是:

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

如有擴(kuò)展,后續(xù)將會(huì)補(bǔ)充。
解決方法:
try {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resourcePatternResolver.getResources("classpath*:rules/**/*.*");
for ( Resource resource : resources ) {
//獲取文件,在打成jar包后,通過(guò)url來(lái)獲取文件,則路徑是正確的
File file = new File(resource.getURL().getFile());
}
} catch (IOException e) {
e.printStackTrace();
}到此這篇關(guān)于Springboot獲取jar包中resources資源目錄下的文件的文章就介紹到這了,更多相關(guān)Springboot獲取resources文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于ObjectUtils.isEmpty()?和?null?的區(qū)別
這篇文章主要介紹了關(guān)于ObjectUtils.isEmpty()?和?null?的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java的接口調(diào)用時(shí)的權(quán)限驗(yàn)證功能的實(shí)現(xiàn)
這篇文章主要介紹了Java的接口調(diào)用時(shí)的權(quán)限驗(yàn)證功能的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Spring?AOP實(shí)現(xiàn)聲明式事務(wù)機(jī)制源碼解析
這篇文章主要為大家介紹了Spring?AOP實(shí)現(xiàn)聲明式事務(wù)機(jī)制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
IDEA自定義Maven倉(cāng)庫(kù)的實(shí)現(xiàn)
使用Maven進(jìn)行Java程序開發(fā)時(shí),開發(fā)者能夠極大地提高開發(fā)效率,本文主要介紹了IDEA自定義Maven倉(cāng)庫(kù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
Spring?Boot使用線程池處理上萬(wàn)條數(shù)據(jù)插入功能
這篇文章主要介紹了Spring?Boot使用線程池處理上萬(wàn)條數(shù)據(jù)插入功能,使用步驟是先創(chuàng)建一個(gè)線程池的配置,讓Spring Boot加載,用來(lái)定義如何創(chuàng)建一個(gè)ThreadPoolTaskExecutor,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-08-08
JDK動(dòng)態(tài)代理提高代碼可維護(hù)性和復(fù)用性利器
這篇文章主要為大家介紹了JDK動(dòng)態(tài)代理提高代碼可維護(hù)性和復(fù)用性利器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Spring?多數(shù)據(jù)源方法級(jí)別注解實(shí)現(xiàn)過(guò)程
多數(shù)據(jù)源管理是Spring框架中非常重要的一部分,它可以提高應(yīng)用程序的靈活性和可靠性,從而更好地滿足業(yè)務(wù)需求,這篇文章主要介紹了Spring?多數(shù)據(jù)源方法級(jí)別注解實(shí)現(xiàn),需要的朋友可以參考下2023-07-07
詳解Elasticsearch如何實(shí)現(xiàn)簡(jiǎn)單的腳本排序
Elasticsearch?是位于?Elastic?Stack?核心的分布式搜索和分析引擎,可以為所有類型的數(shù)據(jù)提供近乎實(shí)時(shí)的搜索和分析。本文主要介紹了Elasticsearch如何實(shí)現(xiàn)簡(jiǎn)單的腳本排序,感興趣的可以了解一下2023-01-01
詳解使用Maven構(gòu)建多模塊項(xiàng)目(圖文)
這篇文章主要介紹了詳解使用Maven構(gòu)建多模塊項(xiàng)目(圖文),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09

