0

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

我可以很容易地做到

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

或者

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,我必须按原样运行它并使用命令行参数。

请指教。

4

2 回答 2

2

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

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

或者,它正在等待你的输入,或者等待你读取它的输出。这可以解释挂起。在互联网上搜索流和Runtime.exec().

ProcessBuilder改为考虑。

于 2012-06-30T00:03:40.233 回答
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();
    }
于 2012-07-07T22:30:04.753 回答