通过 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"));
行!这样可执行文件就有了正确的工作目录并且可以找到资源文件夹。
我有一个 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"));
行!这样可执行文件就有了正确的工作目录并且可以找到资源文件夹。