SpringBoot項(xiàng)目中jar發(fā)布獲取jar包所在目錄路徑的最佳方法
示例代碼:
//第一種 File path = new File(ResourceUtils.getURL("classpath:").getPath()); if(!path.exists()) path = new File(""); System.out.println(path.getAbsolutePath()); //第二種 System.out.println(System.getProperty("user.dir")); //第三種 String path1 = ClassUtils.getDefaultClassLoader().getResource("").getPath(); System.out.println(URLDecoder.decode(path1, "utf-8")); //第四種 String path2 = ResourceUtils.getURL("classpath:").getPath(); System.out.println(path2); //第五種 ApplicationHome h = new ApplicationHome(getClass()); File jarF = h.getSource(); System.out.println(jarF.getParentFile().toString());
這幾種獲取項(xiàng)目目錄的方式中,其中:
第一種、第二種得到的結(jié)果一致
第三種、第四種得到的結(jié)果一致
但是,不同的運(yùn)行方式,他們的結(jié)果是有偏差的。下面我們來(lái)看下不同情況下依次打印的路徑是什么。
先看下直接在idea中運(yùn)行main方法啟動(dòng)項(xiàng)目時(shí)候,打印的路徑,顯示如下:
再看下打包成jar包中,打印的路徑
第一種執(zhí)行方式
操作方式:打開(kāi)命令行,目錄切換到j(luò)ar包所在目錄,然后執(zhí)行 jar -jar 啟動(dòng)命令,打印的路徑如下:
第二種執(zhí)行方式
操作方式:打開(kāi)命令行,直接java -jar E:/web_pack/bis_exporter-1.0-SANPSHOT.jar,即不切換到j(luò)ar所在目錄,而是直接執(zhí)行,打印的路徑如下:
是不是發(fā)現(xiàn)問(wèn)題了!在這種情況下,第一種和第二種方式打印的路徑是不對(duì)的,他打印的路徑就是當(dāng)前執(zhí)行命令時(shí)所在的目錄。這就很容易造成不必要的bug。
例如:我們?cè)趈ar的根目錄寫一個(gè)自定義數(shù)據(jù)配置文件,通過(guò)第一種或者第二種方式讀取數(shù)據(jù),那么使用遠(yuǎn)程執(zhí)行jar的方式,就一定會(huì)報(bào)找不到配置文件的錯(cuò)誤。
補(bǔ)充:springboot獲取運(yùn)行Jar包的目錄
//linux和windows下通用 private String getJarFilePath() { ApplicationHome home = new ApplicationHome(getClass()); File jarFile = home.getSource(); return jarFile.getParentFile().toString(); }
總結(jié)
綜上所述,最好使用第五種方案,獲取運(yùn)行jar所在的目錄。
到此這篇關(guān)于SpringBoot項(xiàng)目中jar發(fā)布獲取jar包所在目錄路徑的文章就介紹到這了,更多相關(guān)SpringBoot獲取jar包所在目錄路徑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中常見(jiàn)的7種BeanDefinition詳解
在?Spring?容器中,我們廣泛使用的是一個(gè)一個(gè)的?Bean,BeanDefinition?從名字上就可以看出是關(guān)于?Bean?的定義,下面就跟隨小編一起深入了解一下常見(jiàn)的7中BeanDefinition吧2023-09-09MyBatis-Plus枚舉和自定義主鍵ID的實(shí)現(xiàn)步驟
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus枚舉和自定義主鍵ID的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02詳解Nacos中注冊(cè)中心和配置中心的實(shí)現(xiàn)
Spring?Cloud?Alibaba?是阿里巴巴提供的一站式微服務(wù)開(kāi)發(fā)解決方案。而?Nacos?作為?Spring?Cloud?Alibaba?的核心組件之一,提供了兩個(gè)非常重要的功能:注冊(cè)中心和配置中心,我們今天來(lái)了解和實(shí)現(xiàn)一下二者2022-08-08java通過(guò)DelayQueue實(shí)現(xiàn)延時(shí)任務(wù)
本文主要介紹了java通過(guò)DelayQueue實(shí)現(xiàn)延時(shí)任務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Mybatis-Plus中update()和updateById()將字段更新為null
本文主要介紹了Mybatis-Plus中update()和updateById()將字段更新為null,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08java跳出for循環(huán)的三種常見(jiàn)方法
這篇文章主要給大家介紹了關(guān)于java跳出for循環(huán)的三種常見(jiàn)方法,需要的朋友可以參考下2023-07-07Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過(guò)程圖解
這篇文章主要介紹了Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08一文帶你深入理解Java?AbstractQueuedSynchronizer
在并發(fā)編程中,鎖是一種保證線程安全的方式,這篇文章主要為大家介紹了AbstractQueuedSynchronizer(AQS)的數(shù)據(jù)結(jié)構(gòu)及實(shí)現(xiàn)原理,感興趣的小伙伴可以了解一下2023-07-07