2012-06-29 4 views
0

Я новичок в JSP/Tomcat и в значительной степени на Java. Вот что мне нужно сделать - когда пользователь нажимает кнопку/посещает URL-адрес, я хочу запустить Java-программу (которая принимает некоторые аргументы командной строки).Tomcat не выполняет внешнюю программу 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 здесь, я должен запустить его как есть и с параметрами командной строки.

Просьба сообщить.

+3

Это действительно плохая идея. Лучше создать правильный сервлет. – 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

Помните также, что вы должны быть уверены, что исполняемый файл Dont запустить «навсегда», и , если вам нужно передать некоторые аргументы, вы могли бы использовать это:

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(); 
    } 
Смежные вопросы