2017-10-18 7 views
0

Ok, donc pour supprimer une étiquette de perfoce, la commande CommandLine est: p4 label -d mylabel123. Maintenant, je veux exécuter cette commande en utilisant Java. J'ai essayé Runtime.exec() et cela fonctionne comme charme. Cependant lorsque je cours la même commande en utilisant ProcessBuilder cela ne fonctionne pas. Toute aide appréciée.Pourquoi la commande Java Runtime.exec fonctionne-t-elle mais ProcessBuilder ne peut pas exécuter la commande client Perforce?

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Main { 
    public static void main(String[] args) throws IOException, InterruptedException { 
     exec1("p4 label -d mylabel123"); 
     exec2("p4","label -d mylabel123"); 
    } 
    public static void exec1(String cmd) 
      throws java.io.IOException, InterruptedException { 
     System.out.println("Executing Runtime.exec()"); 
     Runtime rt = Runtime.getRuntime(); 
     Process proc = rt.exec(cmd); 

     BufferedReader stdInput = new BufferedReader(new InputStreamReader(
       proc.getInputStream())); 
     BufferedReader stdError = new BufferedReader(new InputStreamReader(
       proc.getErrorStream())); 

     String s = null; 
     while ((s = stdInput.readLine()) != null) { 
      System.out.println(s); 
     } 
     while ((s = stdError.readLine()) != null) { 
      System.out.println(s); 
     } 
     proc.waitFor(); 
    } 
    public static void exec2(String... cmd) throws IOException, InterruptedException{ 
     System.out.println("\n\nExecuting ProcessBuilder.start()"); 
     ProcessBuilder pb = new ProcessBuilder(); 
     pb.inheritIO(); 
     pb.command(cmd); 
     Process process = pb.start(); 
     process.waitFor(); 
    } 
} 

Méthode EXEC1() Sortie: Étiquette mylabel123 supprimé.

Méthode exec2() sortie: Commande inconnue. Essayez 'p4 help' pour plus d'informations.

Répondre

3

ProcessBuilder vous demande de fournir le nom de la commande et chaque argument en tant que chaînes séparées. Lorsque vous (indirectement) effectuer

pb.command("p4", "label -d mylabel123"); 

vous construisez un processus qui exécute la commande p4 avec un seul argument, label -d mylabel123. Vous voulez plutôt que d'exécuter cette commande avec trois arguments distincts:

pb.command("p4", "label", "-d", "mylabel123"); 

Votre idée aurait été que le message d'erreur dans le second cas est émis par la commande p4 (il est dit « Try « aide p4 » pour plus d'informations »). Clairement, alors, le problème est avec les arguments. Je vous accorde, cependant, que p4 crée une certaine confusion en appelant un de ses arguments une "commande".