Упакованный Jar не может прочитать файлы с подключенного сетевого диска (Windows) - PullRequest
0 голосов
/ 05 февраля 2019

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

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Похоже, ваша учетная запись для разработки Intellij имеет доступ к этому диску, тогда как учетная запись, запустившая эту загрузку, не имеет к ней доступа.

Я бы предложил использовать полный путь вместо сопоставленного сетевого пути.

0 голосов
/ 05 февраля 2019

Не должно быть никакой разницы при запуске кода из intelliJ или при запуске его из встроенного jar.Но могут быть и другие факторы, вступающие в игру.Может быть, вы используете intelliJ с другим пользователем, чем jvm, который запускает jar?Я предлагаю следующие шаги для решения проблемы:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...