У меня есть приложение 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?




Не должно быть никакой разницы в запуске кода из IntelliJ или из встроенного jar. Но могут быть и другие факторы, вступающие в игру. Может быть, вы запускаете IntelliJ с другим пользователем, а не с jvm, который запускает банку? Предлагаю следующие шаги для решения проблемы:
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
Похоже, ваша учетная запись разработки Intellij имеет доступ к этому диску, тогда как учетная запись, которая запустила эту весеннюю загрузку, не имеет к нему доступа.
Я бы предложил использовать полный путь вместо сопоставленного сетевого пути.
Я запускаю файл jar из файла .bat, который я запускаю как администратор. Я попытаюсь использовать полный сетевой путь.