通过Java Web应用使用Runtime.exec运行脚本

0 投票
1 回答
822 浏览
提问于 2025-04-17 11:09

我创建了一个Java的网页应用,实际上就是用HTTPServlets来根据用户输入的信息运行一些Java代码。我可以顺利地获取用户的信息,把它传递给我的Java程序,然后再把结果返回到界面上。现在让我感到困难(而且有点烦人)的就是,如何使用用户输入的信息去调用一个外部脚本(这个脚本是用来处理用户请求的)。我在一个普通的独立Java应用中测试过这部分代码,运行得很好,但每当我试图通过我的网页应用来运行它时,要么就一直卡着(我不知道它到底有没有在运行这个脚本),要么根本不运行脚本,直接跳到结果页面。

这是我的代码:

 public void runScript() throws InterruptedException{

    try{

        chkPy = new BufferedWriter(new FileWriter("Log.txt"));

        chkPy.write("Running Python Script");
        chkPy.newLine();

        runtime = Runtime.getRuntime();
        p = runtime.exec("cmd /c run.bat > python_results.log");

        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

        String line = "";
        while ((line = stdInput.readLine()) != null) {
      chkPy.write(line);
              chkPy.newLine();
        }
        while ((line = stdError.readLine()) != null) {
                chkPy.write(line);
                chkPy.newLine();
        }


        int exitVal = p.waitFor();

        chkPy.write("Exit Value" +exitVal);
        chkPy.flush();
        chkPy.close(); 

    }catch(IOException ex){

    }
}

更新

Netbeans自带了GlassFish服务器的实现,听起来可能有点傻,但这并不是我最先查看的地方(我现在才看),不过脚本是可以编译的。但似乎我又遇到了另一个问题,现在网页应用死锁了,即使脚本已经完成了文件的写入……我该怎么解决这个问题呢??

1 个回答

1

在不同的线程中分别读取输入和错误信息。

或者可以使用Commons Exec库:http://commons.apache.org/exec/

撰写回答