我是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,我必须按原样和命令行参数运行它。
请告知。
答案 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();
}