从Java servlet调用perl脚本

时间:2011-10-10 18:18:25

标签: java perl servlets tomcat7

我正在尝试从tomcat 7上的java servlet调用perl脚本。我已经设置了context.xml和web.xml,因此我可以通过转到http://localhost:8080/test/cgi-bin/test.pl来运行.pl文件。我也可以直接在java中运行perl,如下所示:

String[] cmdArr = new String[]{"perl", "-e", "print \"Content-type: text/html\n\n\";$now = localtime();print \"<h1>It is $now</h1>\";"};
if (cmdArr != null) {
        Process p = null;
        Runtime rt = Runtime.getRuntime();
        try {
            p = rt.exec(cmdArr);  // throws IOException
            returnValue = p.waitFor();    // throws InterruptedException
        }
        catch (IOException xIo) {
            throw new RuntimeException("Error executing command.",xIo);
        }
        catch (InterruptedException xInterrupted) {
            throw new RuntimeException("Command execution interrupted.",xInterrupted);
        }

        InputStreamReader isr = new InputStreamReader(p.getInputStream());
        BufferedReader stdout = null;
        stdout = new BufferedReader(isr);
        String line = null;
        try {
            while ((line = stdout.readLine()) != null) {
                System.out.println(line);
            }
        }
        catch (IOException xIo) {
            throw new RuntimeException("Error reading process output", xIo);
        }
    }

这样可以正常工作,但如果我尝试通过替换:

来引用我/ WEB-INF / cgi文件夹中的.pl脚本
String[] cmdArr = new String[]{"perl", "-e", "print \"Content-type: text/html\n\n\";$now = localtime();print \"<h1>It is $now</h1>\";"};

有类似的东西:

String cmdArr = "/WEB-INF/cgi/test.pl";

String cmdArr = "/cgi-bin/test.pl";

我一直收到这个错误:

java.io.IOException: Cannot run program "/WEB-INF/cgi/test.pl": error=2, No such file or directory

我猜我的文件路径出错了吗?任何帮助都会非常感激!


更新: 在@hobbs评论后,我改为:String[] cmdArr = new String[]{"perl", "/WEB-INF/cgi/test.pl"};

但如果我在.waitFor()之前添加以下内容:

 BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
 String line;
 while ( (line = br.readLine()) != null){
       System.out.println(line);
 }

我得到了印刷品:

Can't open perl script "/WEB-INF/cgi/test.pl": No such file or directory 

我想这回到原来的问题了?

2 个答案:

答案 0 :(得分:2)

有点令人困惑的是,当exec系统调用在脚本上返回“没有这样的文件或目录”时,它通常意味着找不到shebang行上的解释器。例如如果/WEB-INF/cgi-test.pl以#!/usr/bin/perl开头,则可能是/ usr / bin / perl不存在。或者,如果文件具有Windows行结尾,则可能导致内核查找名为"/usr/bin/perl\x0a"的解释器,该解释器无法找到。

由于您已经确定可以使用以"perl"开头的命令数组运行,所以如何:

String cmdArr = new String[]{"perl", "/WEB-INF/cgi/test.pl"};

答案 1 :(得分:0)

您的问题与正在运行servlet的上下文有关。您需要获取上下文,然后导航到您的文件。请参阅此处以了解如何获取servlet上下文:How to get the Servlet Context from ServletRequest in Servlet 2.5?

您将以如下方式实现您的servlet上下文:

ServletContext context = config.getServletContext();

然后就像这样使用上下文:

String cmdArr = new String[]{"perl", context.getRealPath("/") + "WEB-INF/cgi/test.pl"};