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要求は何もせずにハングします。どのログを探すべきか、ここで何が間違っている可能性があるのか​​わかりません。いろいろなことを2日間試した後、もうすぐ諦めます。

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

TomcatはどのユーザーとしてこのJavaプログラムを実行することになりますか?管理者にすることはできますか?これはWindows2008にありますが、UACは物事に干渉しますか?

ここでRun.classを変更することはできません。そのまま、コマンドラインパラメーターを使用して実行する必要があります。

お知らせ下さい。

4

2 に答える 2

2

1つのアイデア:コマンドラインのデフォルトのトークン化を1つの完全なものとして信頼して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 に答える