2009-08-23 6 views
4

Que devez-vous faire en Java pour obtenir Runtime.exec() pour exécuter un programme qui est sur le chemin? J'essaie d'exécuter gpsbabel que j'ai mis dans le chemin (/ usr/local/bin).en utilisant Runtime.exec() en 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

Quelle erreur/comportement êtes-vous voir? –

Répondre

2

Il héritera du chemin du processus Java. Donc quel que soit l'environnement du processus Java, le processus engendré aura aussi bien. Voici comment vérifier l'environnement:

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

Avez-vous mis l'PATHet exporté? Si vous ne l'exportez pas, il n'est pas disponible pour les sous-processus.

En outre, doit consommer simultanément stdout et stderr, pour éviter le blocage. Sinon, les choses fonctionneront dans certaines circonstances, alors votre processus engendré produira une quantité différente de données et tout s'arrêtera.

Voir this answer pour plus de détails.

+0

Je n'ai pas défini le chemin du tout, n'importe où. C'est le chemin par défaut pour Eclipse et pour bash. –

+0

Le chemin sera défini par utilisateur. Vous pouvez ajouter l'entrée de chemin pour cet exécutable dans votre fichier .bashrc (et peut-être vous reconnecter si vous lancez Eclipse depuis la barre d'outils ou similaire) –

+0

Je pense que la solution * real * est de spécifier le chemin complet vers le binaire, Toutefois, afin que votre programme ne dépende pas de l'environnement, puis en faire un élément de configuration. C'est généralement mon approche * stratégique *. –

3

Quoi que vous fassiez, vous devez lire this. Personne ne devrait utiliser Runtime.exec() sans l'avoir lu.

+0

trouvé que déjà ... il ne parle pas du tout sur le chemin –

3

J'ai ajouté un appel à System.out.println(System.getenv("PATH")); qui imprime uniquement sur

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

donc pour une raison/usr/local/bin ne se présente pas. On dirait que c'est une question MacOSX ou une question Eclipse, pas une question Java. modifier: a demandé this question on superuser à la place.

+0

Voir ma réponse modifiée re. variables et l'exportation –

2

Voici la solution:

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

est le chemin où le excutable de l'application programme \ se trouve par exemple "C: \ MONPROG \"

+0

quelqu'un peut expliquer ce qui ne va pas avec ce code? J'ai testé avec succès en appelant une application de console C++ dans celui-ci. – DareDevil

Questions connexes