我已经运行了一个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可执行文件自己的文件夹?
这里到底出了什么问题,是否有办法解决这个问题?
答案 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"));
添加到上面的代码中!这样,可执行文件具有正确的工作目录,并且可以找到资源文件夹。