getClassLoader().getResource().getPath()获取Java项目路径

282 阅读1分钟

在正常开发的情况下,我们经常会遇到:需要获取指定文件路径,虽然我知道项目在本机的路径,一旦打包发布了,再根据绝对路径获取指定文件,肯定是获取不到的。这时候就需要用java给我们提供的一些获取相对路径方法了。

解决方法:

rootPath的值(我自己项目下的情况):

开发环境下:

image.png

war包部署到Tomcat环境下:

image.png

String rootPath = Your.class.getClassLoader().getResource(basePath).getPath();

自己针对项目写的代码:

/**
 * 获取项目路径org/jeecgframework/web/cgreport/engine/core下的所有.ftl文件名,用来拼接ftl模板路径
 * @return
 */
public static List<String> ftlFileFinding() {

    //项目目录
    String basePath = "org/jeecgframework/web/cgreport/engine/core";
    //目标文件后缀
    String fileExtension = ".ftl";
    //存放.ftl后缀的文件名
    List<String> ftlFiles = new ArrayList<>();

    //获取项目路径(根据项目环境动态获取,部署后仍然奏效)
    String rootPath = MuTiLangUtil.class.getClassLoader().getResource(basePath).getPath();
    File targetFolder = new File(rootPath);
    if (targetFolder.exists() && targetFolder.isDirectory()) {
        searchFtlFiles(targetFolder, fileExtension, ftlFiles);
    }

    return ftlFiles;

}

//查询指定文件目录下的所有指定后缀的文件名
private static void searchFtlFiles (File directory, String fileExtension, List<String> ftlFiles) {
    File[] files = directory.listFiles();

    if (files != null) {
        for (File file : files) {
        //此处不要用递归,可能会导致栈溢出或栈击穿
            // if (file.isDirectory()) {
            //     searchFtlFiles(file, fileExtension, ftlFiles);
            // } else if (file.getName().endsWith(fileExtension)) {
            //     ftlFiles.add(file.getName());
            // }
                if (file.getName().endsWith(fileExtension)) {
                ftlFiles.add(file.getName());
            }
        }
    }
}