我有一个Spring Boot应用程序,该应用程序读取映射的网络驱动器上的文件夹(即m:/ PRODUCTION)中的文件
问题是,当我执行jar文件时,调试输出显示文件夹中不存在任何文件,即使文件夹中已装有文件。
我在同一台计算机上安装了IntelliJ,并且如果我从源代码运行该应用程序,那么它绝对可以正常工作。
我将文件名读取到数组的方法是
private File[] getFilesInPath(String path) {
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
if (listOfFiles != null) {
Arrays.sort(listOfFiles, Comparator.comparingLong(File::lastModified));
}
return listOfFiles;
}
然后,我在应用程序中的许多地方调用此函数,这是一个示例;
public void manuallyProcessAttritionData(List<Line> lines) {
Handler handler = new AttritionHandler().setLines(lines).setService(this);
String pathToProcess = dataFolder + attritionFolder;
log.debug("Processing path: " + pathToProcess);
File[] listOfFiles = getFilesInPath(pathToProcess);
if (listOfFiles != null) {
log.debug("Number of files to process: " + listOfFiles.length);
for (File file : listOfFiles) {
handler.processFile(file);
}
} else {
log.debug("No files to process");
}
}
运行上面的输出是;
Processing ATTRITION data...
Processing path: m:/PRODUCTION
No files to process
...Finished processing ATTRITION data
我已经确认路径正确,从命令行运行以下命令可以正常工作,并且结果中包含文件;
cd m:\PRODUCTION
M:\PRODUCTION>
有人知道为什么可以从在IntelliJ中运行的应用程序中完美读取该文件夹的原因,但是打包成JAR文件时找不到吗?
答案 0 :(得分:1)
从intelliJ运行代码或从内置jar运行代码应该没有什么区别。但是可能还有其他因素在起作用。也许您使用与运行jar的jvm不同的用户来运行intelliJ?我提出以下步骤来解决此问题:
1。使用Path
类可避免平台特定的问题(例如文件分隔符)
代替
new File("path/to/my/directory");
您应该使用
Paths.get("path", "to", "my", "directory").toFile()
或
Paths.get("path/to/my/directory").toFile()
2。检查文件属性
使用下面的代码调查目录是否存在,是否具有正确的权限等。
Path directory = Paths.get("e:/TEMP");
System.out.println("Absolute Path of directory: " + directory.toAbsolutePath());
System.out.println("Directory exists: " + directory.toFile().exists());
System.out.println("Directory is a directory: " + directory.toFile().isDirectory());
System.out.println("Directory isReadable: " + directory.toFile().canRead());
System.out.println("Directory isWriteable: " + directory.toFile().canWrite());
这应该输出类似:
Absolute Path of directory: e:\TEMP
Directory exists: true
Directory is a directory: true
Directory isReadable: true
Directory isWriteable: true
答案 1 :(得分:1)
看起来您的开发帐户Intellij可以访问此驱动器,而作为启动此spring-boot的帐户没有访问权限。
我建议使用完整路径而不是映射的网络路径。