从 Java 调用 Perl 脚本(Eclipse 中的 JAX-WS)

Calling Perl script from Java (JAX-WS in Eclipse)

我有一个 JAX-WS 网络服务,它接收一个字符串作为参数,调用一个 Perl 脚本,然后 return 将字符串转换为大写。它在 Tomcat 8(Eclipse 上的本地主机)上 运行ning。

当我从控制台输入时:

curl -X POST --data "mystring=HelloWorld" http://localhost:8080/MyServices/api/generatePath

除 Perl 调用外一切正常。在调试器上,我看到该行已执行,但显然没有任何反应(甚至没有错误)。如果我从控制台 运行 perl /home/me/workspace/match.pl 它工作得很好。 match.pl 文件的路径是正确的。

此外,process.exitValue() return 2.

@Path("/")
public class MyServices {
    @POST
    @Path("/generatePath")
    @Produces(MediaType.APPLICATION_JSON)

    public Response generatePathService(
            @FormParam("mystring") String myString) {

        Process process = null;

        try {
            process = Runtime.getRuntime().exec("perl /home/me/workspace/match.pl --lang en");
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

        return Response.status(200).entity(myString.toUpperCase()).build();
    }
}

前段时间我得到了类似的东西。我的解决方案是 'accept' 程序的输出。像这样:

Process p = Runtime.getRuntime().exec(cmd);
final InputStream is = p.getInputStream();
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            while (is.available() != 0) {
                is.read();
            }
        } catch (IOException ex) {
        }
    }
}).start();

您还应该尝试使用 p.getErrorStream() 获取错误流。另一种方法是更改​​您的 perl 程序,使标准输出或错误输出不打印任何内容。

或者您调用 shell 脚本并将输出重定向到 dev/null(类似于 ´blabla>/dev/null`。