SpringBoot項目中jar發佈獲取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());

這幾種獲取項目目錄的方式中,其中:

第一種、第二種得到的結果一致

第三種、第四種得到的結果一致

但是,不同的運行方式,他們的結果是有偏差的。下面我們來看下不同情況下依次打印的路徑是什麼。

先看下直接在idea中運行main方法啟動項目時候,打印的路徑,顯示如下:

再看下打包成jar包中,打印的路徑

第一種執行方式

操作方式:打開命令行,目錄切換到jar包所在目錄,然後執行 jar -jar 啟動命令,打印的路徑如下:

第二種執行方式

操作方式:打開命令行,直接java -jar E:/web_pack/bis_exporter-1.0-SANPSHOT.jar,即不切換到jar所在目錄,而是直接執行,打印的路徑如下:

是不是發現問題瞭!在這種情況下,第一種和第二種方式打印的路徑是不對的,他打印的路徑就是當前執行命令時所在的目錄。這就很容易造成不必要的bug

例如:我們在jar的根目錄寫一個自定義數據配置文件,通過第一種或者第二種方式讀取數據,那麼使用遠程執行jar的方式,就一定會報找不到配置文件的錯誤。

補充:springboot獲取運行Jar包的目錄

//linux和windows下通用
private String getJarFilePath() {
    ApplicationHome home = new ApplicationHome(getClass());
    File jarFile = home.getSource();
    return jarFile.getParentFile().toString();
}

總結

綜上所述,最好使用第五種方案,獲取運行jar所在的目錄。

到此這篇關於SpringBoot項目中jar發佈獲取jar包所在目錄路徑的文章就介紹到這瞭,更多相關SpringBoot獲取jar包所在目錄路徑內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: