为什么Java Runtime.exec命令可以工作,但ProcessBuilder无法执行Performce client命令?

为什么Java Runtime.exec命令可以工作,但ProcessBuilder无法执行Performce client命令?,java,perforce,processbuilder,runtime.exec,Java,Perforce,Processbuilder,Runtime.exec,好的,要删除Perfoce标签,命令行命令是:p4 Label-d mylabel123。 现在我想用Java执行这个命令。我尝试了Runtime.exec(),效果很好。但是,当我使用ProcessBuilder运行相同的命令时,它不起作用。谢谢你的帮助 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { pub

好的,要删除Perfoce标签,命令行命令是:
p4 Label-d mylabel123
。 现在我想用Java执行这个命令。我尝试了
Runtime.exec()
,效果很好。但是,当我使用
ProcessBuilder
运行相同的命令时,它不起作用。谢谢你的帮助

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();
    }
}
方法exec1()输出:标签mylabel123已删除


方法exec2()输出:未知命令。请尝试使用“p4帮助”获取信息。

ProcessBuilder
希望您将命令名和每个参数作为单独的字符串提供。当你(间接地)执行

您正在构建一个进程,该进程使用一个参数
label-d mylabel123
运行命令
p4
。您希望使用三个单独的参数运行该命令:

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

您的线索是,第二种情况下的错误消息是由
p4
命令发出的(它说“请尝试“p4 help”以获取信息”)。显然,问题在于这些论点。不过,我承认,
p4
将其一个参数称为“command”,确实会造成一些混乱。

ProcessBuilder
希望您将命令名和每个参数作为单独的字符串提供。当你(间接地)执行

您正在构建一个进程,该进程使用一个参数
label-d mylabel123
运行命令
p4
。您希望使用三个单独的参数运行该命令:

pb.command("p4", "label", "-d", "mylabel123");
您的线索是,第二种情况下的错误消息是由
p4
命令发出的(它说“请尝试“p4 help”以获取信息”)。显然,问题在于这些论点。不过,我承认,
p4
将它的一个参数称为“命令”,确实会造成一些混乱