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

Java 通过ProcessBuilder调用的可执行文件可以';找不到需要的文件,java,tomcat,servlets,processbuilder,Java,Tomcat,Servlets,Processbuilder,我有一个java servlet正在运行,我向它发送了一个文件。然后将该文件传递给创建网页()的可执行文件。我这样做的方法是使用ProcessBuilder。然而奇怪的事情发生了 Potree可执行文件位于我电脑上的一个目录中,该目录中有一个子文件夹,名为resources。这些是Potree可执行文件构建网页所需的资源 每当我从java servlet通过processbuilder调用potree可执行文件时,它都会告诉我它找不到资源文件夹: System.out.println("

我有一个java servlet正在运行,我向它发送了一个文件。然后将该文件传递给创建网页()的可执行文件。我这样做的方法是使用ProcessBuilder。然而奇怪的事情发生了

Potree可执行文件位于我电脑上的一个目录中,该目录中有一个子文件夹,名为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可执行文件,这可能与此有关

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

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

你差点回答自己:

  • 在文件的相对路径有效的目录中运行时,它会工作

/你的可执行文件
/resource/yourfile(file.getAbsolutePath()返回该值,这是正确的,文件在这里)

  • 当从另一个目录运行时

/resource/yourfile(file.getAbsolutePath()返回该文件,但此处不存在该文件)

因此,您必须在配置文件或硬编码文件中传递一个“根文件夹”,所有资源文件和目录都来自该文件夹

始终从此根文件夹生成文件名

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

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

你差点回答自己:

  • 在文件的相对路径有效的目录中运行时,它会工作

/你的可执行文件
/resource/yourfile(file.getAbsolutePath()返回该值,这是正确的,文件在这里)

  • 当从另一个目录运行时

/resource/yourfile(file.getAbsolutePath()返回该文件,但此处不存在该文件)

因此,您必须在配置文件或硬编码文件中传递一个“根文件夹”,所有资源文件和目录都来自该文件夹

始终从此根文件夹生成文件名


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

我找到了解决方案!通过使用ProcessBuilder类中的
目录(File File)
方法,我能够让Potree可执行文件从它自己的目录运行。因此,我添加了行
processBuilder.directory(新文件(“path_to_potree_folder”)到上面的代码!这样,可执行文件就有了正确的工作目录,并且可以找到资源文件夹。

我找到了解决方案!通过使用ProcessBuilder类中的
目录(File File)
方法,我能够让Potree可执行文件从它自己的目录运行。因此,我添加了行
processBuilder.directory(新文件(“path_to_potree_folder”)到上面的代码!这样,可执行文件就有了正确的工作目录,并且可以找到资源文件夹。

谢谢您的回复!看来我已经找到了解决办法。我想我要找的词是:工作目录。我现在要做的是,通过directory(File)方法设置ProcessBuilders目录。这让我们的进程在正确的目录中工作!谢谢你的回复!看来我已经找到了解决办法。我想我要找的词是:工作目录。我现在要做的是,通过directory(File)方法设置ProcessBuilders目录。这让我们的进程在正确的目录中工作!