2012-06-29 185 views
0

我是JSP/Tomcat中的新手,在很大程度上也是Java。这就是我必须做的 - 当用户点击按钮/访问URL时,我想启动一个Java程序(这需要一些命令行参数)。Tomcat无法执行外部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,我必须按照原样和命令行参数运行它。

请指教。

+3

这是一个非常糟糕的主意。最好创建一个适当的servlet。 – bmargulies

+0

我同意这是一个坏主意。这只是原型代码,直到我们聘请具有相关经验的人。 – helpmelearn

回答

2

一个想法是:您依靠命令行的默认标记为一个完整的String,并且它不像您期望的那样解析最后一个。相反,你应该使用这种方法,需要一个String[],你在命令行自己切碎后的形式:

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

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

改为考虑ProcessBuilder

+0

感谢您的ProcessBuilder和String []提示。这是问题之一。另一个是产生的子流程在ErrorStream上抛出一些主流程没有耗尽的东西。再次感谢。 – helpmelearn

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(); 
    }