idea啟動(dòng)與jar包啟動(dòng)中使用resource資源文件路徑的問題
idea啟動(dòng)與jar包啟動(dòng)中使用resource資源文件路徑
問題描述
項(xiàng)目直接用idea運(yùn)行的時(shí)候好好的,但是打包成Jar之后卻出現(xiàn)了莫名其妙的BUG,經(jīng)過很長時(shí)間的調(diào)試之后,才發(fā)現(xiàn)是打包之后的文件路徑出現(xiàn)了問題。
在原本的代碼中使用的是這樣的代碼來讀取resource中的文件
ClassLoader classLoader = this.class.getClassLoader(); ?? URL appUrl = classLoader.getResource("center/AppStarter.java");? File appJava = new File(appUrl.getFile());
這樣的代碼直接運(yùn)行時(shí)沒問題的,能夠正確的讀取到文件,但是打包成jar之后,
在網(wǎng)上查找了很久,終于找到了解決方法。
讀取resource中的文件需要使用InputStream來進(jìn)行讀取,然后轉(zhuǎn)換成String。
具體實(shí)現(xiàn)可以參看下面的代碼。
//2.創(chuàng)建輸入流 String path = "META-INF/item.xml" InputStream is = this.getClass().getClassLoader().getResourceAsStream(path);
這樣寫了之后打包成jar后能夠成功讀取到resource中的文件
問題分析
在idea中可以通過絕對路徑讀取文件,但是package成jar包之后,路徑的文件形式發(fā)生變化,但是可以通過class路徑,然后通過相對路徑的方式拿到文件流,達(dá)到文件內(nèi)容的讀取。
Jar包啟動(dòng)通過ClassPathResource獲取不到文件路徑
項(xiàng)目目錄結(jié)構(gòu)
maven項(xiàng)目resources目錄也是會(huì)被編譯到classpath下的。
ClassPathResource resource = new ClassPathResource("/map/map.properties"); InputStream inputStream = resource.getInputStream(); System.out.println("inputStream.available() = " + inputStream.available()); System.out.println("resource.getFile().getAbsolutePath() = " + resource.getFile().getAbsolutePath());
如果是使用idea進(jìn)行本地開發(fā)時(shí),是可以獲取到classpath下的資源的路徑的,因?yàn)槭亲x取的磁盤上的真正的那個(gè)文件。
但是如果將項(xiàng)目打包成一個(gè)jar包后,再獲取map.properties是獲取不到的,對于操作系統(tǒng)來說最多只能讀取到j(luò)ar包,而不能再繼續(xù)讀取jar包里面的文件了,如果繼續(xù)讀取,只能交給jvm去讀了,此時(shí)能讀取到二進(jìn)制流,而不能獲取到路徑。
可通過以下幾種方式獲取classpath下的資源
ClassPathResource classPathResource = new ClassPathResource("/map/map.properties"); InputStream cis = classPathResource.getInputStream(); //獲取classpath下第一個(gè)/map/map.properties,這個(gè)根據(jù)jar包的加載先后順序有關(guān) InputStream ris = ClassPathResource.class.getClassLoader().getResourceAsStream("/map/map.properties"); //這個(gè)是獲取classpath下所有的map/map.properties,在jvm運(yùn)行時(shí),所有jar都相當(dāng)于是一個(gè)classpath Enumeration<URL> resources = ClassPathResource.class.getClassLoader().getResources("/map/map.properties");
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis-plus自定義SQL注入器查詢@TableLogic邏輯刪除后的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Mybatis-plus自定義SQL注入器查詢@TableLogic邏輯刪除后的數(shù)據(jù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03MyBatis-Plus中公共字段的統(tǒng)一處理的實(shí)現(xiàn)
在開發(fā)中經(jīng)常遇到多個(gè)實(shí)體類有共同的屬性字段,這些字段屬于公共字段,本文主要介紹了MyBatis-Plus中公共字段的統(tǒng)一處理的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08SpringBoot實(shí)現(xiàn)微信小程序支付功能
小程序支付功能已成為眾多應(yīng)用的核心需求之一,本文主要介紹了SpringBoot實(shí)現(xiàn)微信小程序支付功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04ServletContext讀取web資源_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了ServletContext讀取web資源,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07Java實(shí)現(xiàn)Map遍歷key-value的四種方法
本文主要介紹了Java實(shí)現(xiàn)Map遍歷key-value的四種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07