【问题标题】:Running a .exe file from a Java web app doesn't work从 Java Web 应用程序运行 .exe 文件不起作用
【发布时间】:2016-08-04 05:24:47
【问题描述】:

我正在尝试从我的 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);

我意识到,如果我将 .exe 文件放入我的项目根目录并以管理员身份运行 Eclipse,它就可以工作。但是我不知道如何在部署后将它放入我的网络应用程序根目录以执行相同的操作,我试图将它放在不同的位置,但什么也没有!

【问题讨论】:

  • 您的应用程序会在Windows 上以Admin 权限运行吗?
  • 其实我也不知道,这里是本地大学的,事情不是很清楚。如果我能给 .exe 文件提供写权限,我认为这就足够了。
  • 我问是因为您可能无法在 Linux 上运行 exe 文件。否则,您可以只嵌入带有 WAR 的可执行文件,将其保存到临时目录并使用 Java ProcessBuilder 执行它。但是,这仅在容器以管理员权限启动时才有效,由于安全原因,情况可能不会如此。为什么还要执行exe呢?
  • 如果您的可执行文件只是写入标准输出可能会更好 - 您可以在任何需要的地方通过管道传输它而不会弄乱文件权限。
  • .exe 文件是 Pascal 遗留代码,用于解决线性规划问题,我无法以任何形式更改它。遗留代码的工作方式是读取文本文件并创建带有答案的输出文本文件。我可以创建 .exe 所需的文件,但 .exe 本身无法编写答案文件。

标签: java tomcat8


【解决方案1】:

我能够找出问题所在。我认为 Runtime.getRuntime().exec() 会表现得像一个传统的 DOS 提示符,但我错了。事实上,问题本身不是窗口或文件权限问题,而是对 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 程序路径的文件。 现在一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2010-11-17
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多