打包的Jar无法从映射的网络驱动器读取文件(Windows)

时间:2019-02-05 14:17:38

标签: java spring-boot

我有一个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 :(得分: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的帐户没有访问权限。

我建议使用完整路径而不是映射的网络路径。