2016-12-13 23 views
1

Ich bin neu in ProcessBuilder. Heute schreibe ich eine einfache Anwendung, um die "Java-Version" auszuführen, bekam aber immer die IOException.Got IOException CreateProcess Fehler = 2, Das System kann die angegebene Datei nicht finden

ProcessBuilder pb = new ProcessBuilder("java -version"); 
     try { 
      Map<String, String> map = pb.environment(); 
      Process p = pb.start(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

Die Ausnahme, wie unten geworfen

java.io.IOException: Cannot run program "java -version": CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) 

ich sicherstellen kann, dass JAVA_HOME in Umgebungsvariable gesetzt ist, mein Eclipse zeigt auch auf das JDK.

JAVA_HOME=C:\JDK1.8.0_66-X64. 

Kann jemand sagen, was das Problem in meinem Code/Einstellungen ist?

+1

Sie müssen "java" und "-version" 'als separate Befehlsargumente übergeben, wenn Sie den' ProcessBuilder' konstruieren. – JonK

+1

ProcessBuilder übernimmt das erste Element des Arrays und interpretiert es als Programm- (Befehls-) Name und der Rest von allen als Argumente für das Programm. Probieren Sie ProcessBuilder aus pb = new ProcessBuilder (new String [] {"java", "-version"}); –

+0

@ShubhamChaurasia Es gibt einen Varargs-Konstruktor, so dass Sie das Array nicht manuell erstellen müssen – JonK

Antwort

1

Der Konstruktor der Klasse ProcessBuilder, den Sie verwenden, benötigt ein Argument vom Typ . Auch das erste Element muss der Name des Betriebssystemprogramms sein. Sie erhalten diese Ausnahme, da das System die Datei java -version.exe nicht finden konnte (wenn Sie in Windows sind). Der gewünschte Dateiname lautet java.exe. Verwenden Sie also ProcessBuilder("java", "-version"). Siehe Dokumentation here. Es gibt ein schönes Beispiel in der Dokumentation.

+0

Thx. Durch Teilen des Befehls in zwei Teile läuft das Programm ohne Ausnahme. Aber ich kann keine Ausgabe finden, indem ich die p.getInputStream() direkt nach pb.start() überprüfe. Ich folge dem Ansatz hier [link] http://stackoverflow.com/questions/3936023/printing-runtime-exec-outputstream-to-console –

+0

Ich habe es herausgefunden. Sie müssen inheritIO() an pb anhängen –

Verwandte Themen