通过ProcessBuilder调用的可执行文件无法找到所需的文件

时间:2016-08-21 21:31:54

标签: java tomcat servlets processbuilder

我已经运行了一个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文件夹中的servlet中调用可执行文件而不是直接从其执行的potree可执行文件自己的文件夹?

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

2 个答案:

答案 0 :(得分:0)

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)

所以你必须在配置文件中传递一个“根文件夹”或硬编码,从那里所有的资源文件&amp; dirs起源。

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

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

答案 1 :(得分:0)

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