欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot獲取jar包中resources資源目錄下的文件

 更新時(shí)間:2023年12月26日 15:03:11   作者:Stephen·You  
今天在項(xiàng)目中遇到一個(gè)業(yè)務(wù)場(chǎng)景,需要用到resources資源目錄下的文件,本文主要介紹了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)來(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資源目錄專(zhuān)題
 * @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)類(lèi)中,有兩行被注釋掉的代碼:

上面這行代碼在本地運(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)文章

  • springboot集成redis之字典緩存詳解

    springboot集成redis之字典緩存詳解

    Redis的字典緩存是支撐其高性能的一個(gè)關(guān)鍵因素,它使得Redis能夠以極快的速度處理大量的數(shù)據(jù),這篇文章主要介紹了springboot集成redis之字典緩存,需要的朋友可以參考下
    2024-07-07
  • Mybatis-Plus查詢(xún)中如何排除標(biāo)識(shí)字段

    Mybatis-Plus查詢(xún)中如何排除標(biāo)識(shí)字段

    這篇文章主要介紹了Mybatis-Plus查詢(xún)中排除標(biāo)識(shí)字段的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • springboot集成spark并使用spark-sql的示例詳解

    springboot集成spark并使用spark-sql的示例詳解

    這篇文章主要介紹了spring-boot集成spark并使用spark-sql的方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Spring AbstractRoutingDatasource 動(dòng)態(tài)數(shù)據(jù)源的實(shí)例講解

    Spring AbstractRoutingDatasource 動(dòng)態(tài)數(shù)據(jù)源的實(shí)例講解

    本文介紹如何使用 Spring AbstractRoutingDatasource 基于上下文動(dòng)態(tài)切換數(shù)據(jù)源,因此我們會(huì)讓查找數(shù)據(jù)源邏輯獨(dú)立于數(shù)據(jù)訪問(wèn)之外
    2021-07-07
  • 淺談Java中的n種隨機(jī)數(shù)產(chǎn)生辦法

    淺談Java中的n種隨機(jī)數(shù)產(chǎn)生辦法

    眾所周知,隨機(jī)數(shù)是任何一種編程語(yǔ)言最基本的特征之一。而生成隨機(jī)數(shù)的基本方式也是相同的:產(chǎn)生一個(gè)0到1之間的隨機(jī)數(shù)??此坪?jiǎn)單,但有時(shí)我們也會(huì)忽略了一些有趣的功能。
    2015-09-09
  • Spring中的NamespaceHandler接口及相關(guān)軟件包說(shuō)明

    Spring中的NamespaceHandler接口及相關(guān)軟件包說(shuō)明

    這篇文章主要介紹了Spring中的NamespaceHandler接口及相關(guān)軟件包說(shuō)明,NamespaceHandler 接口,DefaultBeanDefinitionDocumentReader 使用該接口來(lái)處理在spring xml 配置文件中自定義的命名空間,需要的朋友可以參考下
    2023-12-12
  • java比較器Comparable接口與Comaprator接口的深入分析

    java比較器Comparable接口與Comaprator接口的深入分析

    本篇文章是對(duì)java比較器Comparable接口與Comaprator接口進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 詳解Java中跳躍表的原理和實(shí)現(xiàn)

    詳解Java中跳躍表的原理和實(shí)現(xiàn)

    跳躍表(Skip list)是有序鏈表的擴(kuò)展,簡(jiǎn)稱(chēng)跳表,它在原有的有序鏈表上增加了多級(jí)索引,通過(guò)索引來(lái)實(shí)現(xiàn)快速查找,實(shí)質(zhì)上是一種可以進(jìn)行二分查找的有序鏈表。本文主要為大家介紹了跳躍表的原理和實(shí)現(xiàn),需要的可以參考一下
    2022-12-12
  • MyBatis常用的jdbcType數(shù)據(jù)類(lèi)型

    MyBatis常用的jdbcType數(shù)據(jù)類(lèi)型

    這篇文章主要介紹了MyBatis常用的jdbcType數(shù)據(jù)類(lèi)型的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 基于Java SSM實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng)

    基于Java SSM實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng)

    本項(xiàng)目基于Java SSM框架實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng),主要實(shí)現(xiàn)系統(tǒng)的在線點(diǎn)餐功能。文中的示例代碼講解詳細(xì),感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-02-02

最新評(píng)論