不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2022-04-03 20:59:13  修改时间:2023-02-01 14:48:12  分类:Java框架/系统  编辑
// 第一种
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 home = new ApplicationHome(getClass());
File jarFile = home.getSource();
System.out.println(jarFile.getParentFile().toString());

这几种获取项目目录的方式中,其中:

第一种、第二种得到的结果一致

第三种、第四种得到的结果一致

但是,不同的运行方式,他们的结果是有偏差的。下面我们来看下不同情况下依次打印的路径是什么。

先看下直接在idea中运行main方法启动项目时候,打印的路径,显示如下:

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

第一种执行方式

操作方式:打开命令行,目录切换到jar包所在目录,然后执行 jar -jar  启动命令,打印的路径如下:

第二种执行方式

操作方式:打开命令行,直接 java -jar  E:/web_pack/bis_exporter-1.0-SANPSHOT.jar,即不切换到jar所在目录,而是直接执行,打印的路径如下:

是不是发现问题了!在这种情况下,第一种和第二种方式打印的路径是不对的,他打印的路径就是当前执行命令时所在的目录。这就很容易造成不必要的bug。

例如:我们在jar的根目录写一个自定义数据配置文件,通过第一种或者第二种方式读取数据,那么使用远程执行jar的方式,就一定会报找不到配置文件的错误。

总结

综上所述,最好使用第五种方案,获取运行jar所在的目录。

 

参考:https://blog.csdn.net/liangcha007/article/details/88526181

 


最后,封装成一个路径助手类:PathHelper.java

package com.wanma.framework_noweb.helper;

import org.springframework.boot.system.ApplicationHome;

import java.io.File;

/**
 * Path助手类
 */
public class PathHelper {
    /**
     * 获获取当前jar包所在目录
     */
    public static String getRootPath() {
        ApplicationHome home = new ApplicationHome(PathHelper.class);
        File jarFile = home.getSource();
        return jarFile.getParentFile().toString();
    }
}