Ошибка запуска программы из Java (с использованием ProcessBuilder)
Я пытаюсь вызвать cleartool из java-приложения, но cleartool зависает даже для простого "-version" аргумент. Запуск cleardiff вместо cleartool работает нормально, поэтому, очевидно, в программе cleartool есть что-то особенное (что, я полагаю, связано с ее интерактивными возможностями).
Следующая программа
<code>import java.io.*; import java.util.*; public class ExecTesting extends Thread { private List<String> command = new ArrayList<String>(); public ExecTesting (List<String> command) { super(); this.command = command; } private void print(String s) { System.out.println(s); } @Override public void run() { Process process; OutputStream stdin; InputStream stdout; InputStream stderr; String line; try { String commandString = joinList(command, " "); print("Executing: " + commandString); // runtime.exec has several issues (http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1) // better to use ProcessBuilder (http://java.sun.com/developer/JDCTechTips/2005/tt0727.html#2) //process = Runtime.getRuntime().exec(commandString); process = new ProcessBuilder(command).start(); // it fails in both cases though stdin = process.getOutputStream(); stdout = process.getInputStream(); stderr = process.getErrorStream(); BufferedReader bufferedStderr = new BufferedReader(new InputStreamReader(stderr)); while ((line = bufferedStderr.readLine()) != null) { print("stderr: " + line); } bufferedStderr.close(); BufferedReader bufferedStdout = new BufferedReader(new InputStreamReader(stdout)); while ((line = bufferedStdout.readLine()) != null) { print("stdout: " + line); } bufferedStdout.close(); stdin.close(); stdout.close(); stderr.close(); process.waitFor(); print("Execution finished, exit code " + process.exitValue()); process.destroy(); } catch (IOException e) { print("IOException: " +e.getStackTrace()); } catch (InterruptedException e) { print("InterruptedException: " + e.getStackTrace()); } } /* assumes a list with at least one element */ private static String joinList(List<String> list, String glue) { Iterator<String> i = list.iterator(); String ret = i.next(); while (i.hasNext()) { ret += glue + i.next(); } return ret; } public static void main(String[] args) { ArrayList<String> cmd1 = new ArrayList<String>(); cmd1.add("c:\\Program Files\\Rational\\ClearCase\\bin\\cleardiff.exe"); cmd1.add("-version"); ExecTesting et1 = new ExecTesting(cmd1); et1.start(); ArrayList<String> cmd2 = new ArrayList<String>(); //cmd2.add("c:\\Program Files\\Rational\\ClearCase\\bin\\cleardiff.exe"); cmd2.add("c:\\Program Files\\Rational\\ClearCase\\bin\\cleartool.exe"); cmd2.add("-version"); ExecTesting et2 = new ExecTesting(cmd2); et2.start(); et1 = new ExecTesting(cmd1); et1.start(); } } </code>
дает следующий вывод
<code>Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version] Executing: [c:\Program Files\Rational\ClearCase\bin\cleartool.exe, -version] Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version] stdout: cleardiff 2003.06.10+ (Tue Jul 13 14:02:05 2004) Execution finished, exit code 0 </code>
зависание при выполнении команды cleartool. Если вместо этого cmd2 изменен для очистки, то результат будет таким, как ожидалось
<code>Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version] Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version] Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version] stdout: cleardiff 2003.06.10+ (Tue Jul 13 14:02:05 2004) Execution finished, exit code 0 stdout: cleardiff 2003.06.10+ (Tue Jul 13 14:02:05 2004) Execution finished, exit code 0 stdout: cleardiff 2003.06.10+ (Tue Jul 13 14:02:05 2004) Execution finished, exit code 0 </code>
Вопрос: Кто-нибудь знает, почему cleartool зависает и как исправить?