在正常开发的情况下,我们经常会遇到:需要获取指定文件路径,虽然我知道项目在本机的路径,一旦打包发布了,再根据绝对路径获取指定文件,肯定是获取不到的。这时候就需要用java给我们提供的一些获取相对路径方法了。
解决方法:
rootPath的值(我自己项目下的情况):
开发环境下:
war包部署到Tomcat环境下:
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());
}
}
}
}