通过 ProcessBuilder 调用的可执行文件找不到需要的文件

Executable called via ProcessBuilder can't find needed files

我有一个 java servlet 运行,我发送了一个文件。然后将该文件传递给创建网页的可执行文件 (https://github.com/potree/PotreeConverter)。我这样做的方法是使用 ProcessBuilder。然而奇怪的事情发生了...

Potree 可执行文件位于我 PC 上的一个目录中,在此目录中有一个名为 resources 的子文件夹。这些是 Potree 可执行文件构建网页所需的资源。

每当我从 java servlet 通过 processbuilder 调用 potree 可执行文件时,它告诉我找不到资源文件夹:

    System.out.println("Creating webpage...");
    ProcessBuilder processBuilder = new ProcessBuilder(POTREE_EXE, file.getAbsolutePath(), "-o", XAMPP_DIR, "-p", "pageName", "--overwrite");
    processBuilder.redirectError(Redirect.INHERIT);
    processBuilder.redirectOutput(Redirect.INHERIT);
    try {
        Process p = processBuilder.start();
        p.waitFor();
    } catch(IOException e) {
        System.out.println(e.getMessage());
    } catch(InterruptedException e) {
        System.out.println(e.getMessage());
    }
}

当我尝试通过 CMD 直接使用 potree 可执行文件时,找到它的资源文件夹没有问题。我转到 CMD 中的 potree 文件夹,然后执行与 processbuilder 完全相同的代码行。现在可执行文件能够找到资源文件夹...

java servlet 在 tomcat 8.0 服务器上运行...可能与以下事实有关:processbuilder 从位于 tomcat 文件夹而不是直接从其自己的文件夹执行的 potree 可执行文件?

这里到底出了什么问题,有没有办法解决这个问题?

file.getAbsolutePath() 在这里是虚假的安全性:如果文件是相对路径,它只会将当前文件夹附加到您的文件。 除非您计划 chdir 代码中的某处或为了获得准确的错误消息,否则没有必要。

你几乎自己回答了:

  • 当运行在文件的相对路径有效的目录中时,有效

<potree dir> <potree dir>/yourexecutable <potree dir>/resource/yourfile (file.getAbsolutePath() returns that and that's correct, file is here)

  • 当 运行 来自另一个目录时,嗯

<another dir> <another dir>/resource/yourfile (file.getAbsolutePath() returns that and the file does not exist here)

所以你必须在配置文件或硬编码中传递一个 "root folder",所有资源文件和目录都来自那里。

始终从此根文件夹构建文件名。

根据语言的不同,还有多种技术可以从启动脚本自动计算它。

我找到了解决办法!通过使用来自 ProcessBuilder class 的 directory(File file) 方法,我能够让 Potree 可执行文件 运行 从它自己的目录中。所以我在上面的代码中添加了 processBuilder.directory(new File("path_to_potree_folder")); 行!这样可执行文件就有了正确的工作目录并且可以找到资源文件夹。