2009-08-23 12 views
4

Was müssen Sie in Java tun, um die Runtime.exec() zu erhalten, um ein Programm auszuführen, das auf dem Pfad ist? Ich versuche gpsbabel zu starten, das ich in den Pfad (/ usr/local/bin) gelegt habe.mit Runtime.exec() in Java

public class GpxLib { 

    public static void main(String[] args) { 
     try 
     { 
      Runtime r = Runtime.getRuntime(); 
      Process p = r.exec("gpsbabel -i garmin -f usb: -o gpx -F -"); 
      InputStream is = p.getInputStream(); 
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      while (true) 
      { 
       String s = br.readLine(); 
       if (s == null) 
        break; 
       System.out.println(s); 
      } 
      br.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(System.err); 
     } 
    } 
} 
+0

Welche Fehler/Verhalten sehen Sie? –

Antwort

2

Erbt den Pfad vom Java-Prozess. Also egal welche Umgebung der Java-Prozess hat, der erzeugte Prozess wird auch funktionieren. Hier ist, wie die Umwelt zu überprüfen:

Map<String, String> env = System.getenv(); 
for (String envName : env.keySet()) { 
    System.out.format("%s=%s%n", envName, env.get(envName)); 
} 

Haben Sie setzen den PATHund exportiert? Wenn Sie es nicht exportieren, ist es für Unterprozesse nicht verfügbar.

Zusätzlich müssen Sie müssen stdout und stderr gleichzeitig konsumieren, um Blockierung zu verhindern. Sonst funktioniert das unter Umständen, dann wird der erzeugte Prozess eine andere Menge an Daten ausgeben und alles wird zum Stillstand kommen.

Weitere Informationen finden Sie unter this answer.

+0

Ich habe den Pfad überhaupt nicht festgelegt, überall. Dies ist der Standardpfad für Eclipse und bash. –

+0

Der Pfad wird pro Benutzer festgelegt. Vielleicht möchten Sie den Pfadeintrag für diese ausführbare Datei in Ihrer .bashrc hinzufügen (und vielleicht erneut anmelden, wenn Sie Eclipse von der Symbolleiste oder ähnlichem starten). –

+0

Ich denke, die * real * -Lösung soll den vollständigen Pfad zur Binärdatei angeben, jedoch, damit Ihr Programm nicht abhängig von der Umgebung ist, und dann ein Konfigurationselement daraus machen. Das ist normalerweise mein strategischer Ansatz. –

3

Was immer Sie tun, müssen Sie this lesen. Niemand sollte Runtime.exec() verwenden, ohne es gelesen zu haben.

+0

gefunden, dass schon ... es spricht überhaupt nicht über den Pfad –

3

habe ich einen Anruf zu System.out.println(System.getenv("PATH")); die aus irgendeinem Grund druckt nur

/usr/bin:/bin:/usr/sbin:/sbin 

so/usr/local/bin nicht angezeigt. Sieht so aus, als wäre dies eine MacOSX-Frage oder eine Eclipse-Frage, keine Java-Frage. edit: gefragt this question on superuser statt. Hier

+0

Siehe meine modifizierte Antwort zu. Variablen und Exportieren –

2

ist die Lösung:

ProcessBuilder proc = new ProcessBuilder("<Directory PAth>" + "Executable.exe"); 
proc.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
proc.directory(fi); //fi = the output directory path 
proc.start(); 

ist der Pfad, auf dem Programm \ Anwendung excutable befindet sich beispiels "C: \ myprog \"

+0

kann jeder erklären, was mit diesem Code falsch ist? Ich habe erfolgreich getestet, indem ich eine C++ - Konsolenanwendung darin aufgerufen habe. – DareDevil