从Java web应用程序运行.exe文件不会';行不通

从Java web应用程序运行.exe文件不会';行不通,java,tomcat8,Java,Tomcat8,我正在尝试从我的web应用程序(Windows+Primefaces 5+Tomcat 8)运行一个用Pascal开发的.exe文件。程序生成了一个文本文件,我将在之后读取它,但它似乎没有这样做的权限,没有抛出异常 以下是我选择路径的方式: String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/WEB-INF/lib/"); projeto.setQtde(1); this.esque

我正在尝试从我的web应用程序(Windows+Primefaces 5+Tomcat 8)运行一个用Pascal开发的.exe文件。程序生成了一个文本文件,我将在之后读取它,但它似乎没有这样做的权限,没有抛出异常

以下是我选择路径的方式:

String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/WEB-INF/lib/");
projeto.setQtde(1);
this.esquemas = gerenciarProjeto.realizarCorte(projeto, usuario, path+"/");
以下是我如何称呼该计划:

Runtime rt = Runtime.getRuntime();
Process pc = rt.exec(this.caminho+"cortebi.exe");

InputStreamReader isr = new InputStreamReader(pc.getErrorStream());
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");

while ( (line = br.readLine()) != null){
  System.out.println(line);
}

System.out.println("</ERROR>");
int exitVal = pc.waitFor();
System.out.println("Process exitValue: " + exitVal);
Runtime rt=Runtime.getRuntime();
进程pc=rt.exec(this.caminho+“cortebi.exe”);
InputStreamReader isr=新的InputStreamReader(pc.getErrorStream());
BufferedReader br=新的BufferedReader(isr);
字符串行=null;
System.out.println(“”);
而((line=br.readLine())!=null){
系统输出打印项次(行);
}
System.out.println(“”);
int exitVal=pc.waitFor();
System.out.println(“进程exitValue:+exitVal”);

我意识到,如果我将.exe文件放入我的项目根目录中,并以管理员身份运行Eclipse,它就会工作。但我不知道如何将它放到我的web应用根目录中,以便在它部署后执行相同的操作,我尝试将它放到不同的位置,但什么都没有

我能找出问题所在。我认为Runtime.getRuntime().exec()的行为类似于传统的DOS提示符,但我错了。事实上,问题本身不是windows或文件权限问题,而是对exec()方法工作原理的误解。我写了一段新代码:

public void executarCortebi(File file){
    try {

        Process pc = Runtime.getRuntime().exec("cmd /c start cortebi.exe",null, file);          

        StreamGobbler error = new StreamGobbler(pc.getErrorStream(), "ERRO");

        StreamGobbler output = new StreamGobbler(pc.getInputStream(), "OUTPUT");


        error.start();
        output.start();

        pc.waitFor();

        Thread.sleep(800);  

    } catch (IOException e) {
        e.printStackTrace();
    }catch(InterruptedException e)  {
        e.printStackTrace();
    }
}
正如我所说,exec()方法的工作方式受到了更多的限制,我在这里找到了好的材料:。 在解释用于我的getRuntime.exec()的参数时,我们有一个休止符:首先是必须执行的命令本身(很明显旧的cold和新的cold之间存在差异),其次是.exe文件的参数,在本例中为none,第三个是具有.exe程序路径的文件。
现在一切都好了

你的应用程序是否会在
Windows
上运行,并具有
Admin
权限?事实上,我不知道,这是为当地的一所大学准备的,事情还不太清楚。如果我能给.exe文件赋予写权限,我想那就足够了。我这样问是因为你可能无法在Linux上运行
exe
文件。否则,您可以将可执行文件嵌入WAR,将其保存到临时目录,并使用JavaProcessBuilder执行它。但是,这只在容器是以管理员权限启动时才起作用,因为安全原因,情况可能不是这样。你为什么还要执行exe?如果你的可执行文件只是写入标准输出,那可能会更好-你可以在任何需要的地方通过管道传输,而不会影响文件权限..exe文件是一个Pascal遗留代码,是为解决线性规划问题而编写的,我不能以任何形式更改它。遗留代码的工作方式是读取文本文件并创建带有答案的输出文本文件。我能够创建.exe所需的文件,但.exe本身无法写入应答文件。