我试图在我的网络应用程序(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就可以了。但我不知道怎么把它放到我的网络应用程序根目录中,在它部署之后也一样,我试图将它放在不同的位置而没有任何东西!
答案 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程序路径的文件。 现在一切正常!