Упакованный Jar не может прочитать файлы с подключенного сетевого диска (Windows)

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
185
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не должно быть никакой разницы в запуске кода из 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, который я запускаю как администратор. Я попытаюсь использовать полный сетевой путь.

SheppardDigital 05.02.2019 18:47

Другие вопросы по теме