Tomcat无法执行外部java程序

时间:2012-06-29 23:50:10

标签: java jsp tomcat

我是JSPs / Tomcat的新手,在很大程度上也是Java的新手。这就是我要做的事情 - 当用户点击按钮/访问URL时,我想启动一个Java程序(它需要一些命令行参数)。

我很容易做到

Runtime.exec("C:\\Python27\\python.exe test.py") 

OR

Runtime.exec("java -cp %CLASSPATH%;C:\\devprojects HelloWorld"

这很好用。 HelloWorld.class只打印“HelloWorld”。

但是,当我尝试使用命令行参数的java程序时,GET请求只是挂起而什么都不做。我不知道要查找哪些日志或这里可能有什么问题。在花了两天时间尝试各种各样的事情之后,我现在就要放弃了。

Runtime.exec("java -cp %CLASSPATH%;C:\\devprojects Run --username Blah --password Foo");

Tomcat最终运行这个java程序的用户是什么?我可以让它成为管理员吗?这是在Windows 2008上,UAC会干扰事情吗?

我无法在这里修改Run.class,我必须按原样和命令行参数运行它。

请告知。

2 个答案:

答案 0 :(得分:2)

一个想法:您依赖于命令行的默认标记化作为一个完整的String,并且它没有像您期望的那样解析最后一个。相反,在你自己切断命令行后,你应该使用这个方法的形式String[]

http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang.String[])

或者,它正在等待您的输入,或等待您阅读其输出。这可以解释这个问题。在互联网上搜索溪流和Runtime.exec()的危险。

请考虑ProcessBuilder

答案 1 :(得分:0)

还要记住,你必须确保执行的文件不会运行"永远",和 如果你需要传递一些参数,你可以使用它:

    static String startProcess(String command, String dir) throws IOException {
        StringBuffer ret = new StringBuffer();
        String[] comm = new String[3];
        comm[0] = COMMAND_INTERPRETER[0];
        comm[1] = COMMAND_INTERPRETER[1];
        comm[2] = command;
        long start = System.currentTimeMillis();
        try {
            //Start process
            Process ls_proc = Runtime.getRuntime().exec(comm, null, new File(dir));
            //Get input and error streams
            BufferedInputStream ls_in = new BufferedInputStream(ls_proc.getInputStream());
            BufferedInputStream ls_err = new BufferedInputStream(ls_proc.getErrorStream());
            boolean end = false;
            while (!end) {
                int c = 0;
                while ((ls_err.available() > 0) && (++c <= 1000)) {
                    ret.append(conv2Html(ls_err.read()));
                }
                c = 0;
                while ((ls_in.available() > 0) && (++c <= 1000)) {
                    ret.append(conv2Html(ls_in.read()));
                }
                try {
                    ls_proc.exitValue();
                    //if the process has not finished, an exception is thrown
                    //else
                    while (ls_err.available() > 0)
                        ret.append(conv2Html(ls_err.read()));
                    while (ls_in.available() > 0)
                        ret.append(conv2Html(ls_in.read()));
                    end = true;
                }
                catch (IllegalThreadStateException ex) {
                    //Process is running
                }
                //The process is not allowed to run longer than given time.
                if (System.currentTimeMillis() - start > MAX_PROCESS_RUNNING_TIME) 
//this is very important
{
                    ls_proc.destroy();
                    end = true;
                    ret.append("!!!! Process has timed out, destroyed !!!!!");
                }
                try {
                    Thread.sleep(50);
                }
                catch (InterruptedException ie) {}
            }
        }
        catch (IOException e) {
            ret.append("Error: " + e);
        }
        return ret.toString();
    }