从Java Web应用程序运行.exe文件不起作用

时间:2016-07-28 15:57:27

标签: java tomcat8

我试图在我的网络应用程序(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);

我意识到如果我将.exe文件放入我的项目根目录并以管理员身份运行Eclipse就可以了。但我不知道怎么把它放到我的网络应用程序根目录中,在它部署之后也一样,我试图将它放在不同的位置而没有任何东西!

1 个答案:

答案 0 :(得分:0)

我能够弄清楚问题是什么。我认为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()方法的工作方式受到更多限制,我在这里找到了很好的材料:When Runtime.exec() won't。 解释用于我的getRuntime.exec()的参数,我们有一个休闲:首先是必须执行的命令本身(显而易见旧冷和新旧之间的差异),第二个是.exe文件的参数在这种情况下,没有,第三个是具有我的.exe程序路径的文件。 现在一切正常!