我正在尝试将字符串数组传递给函数到ProcessBuilder
。当我通过数组时,我得到的是CreateProccess error=2, The system cannot find the file specified
这里是代码:
public static String[] splitCommand(GitNotifier gn) {
String s = gn.tf[1].getText();
String[] command = s.split("\\s+" + "\b");
return command;
}
public static void process(GitNotifier gn) throws IOException {
String[] command = {"git", "log", "-1", "HEAD"};
ProcessBuilder builder = new ProcessBuilder(command); // works
ProcessBuilder builder = new ProcessBuilder(splitCommand(gn)); // doesn't
builder = builder.directory(new File(path));
Process p = builder.start();
printOutput(p);
}
带有Arrays.toString(splitCommand(gn))
的字符串如下所示:[git log -1 HEAD]
Arrays.toString(command))
:[git, log, -1, HEAD]
我真的没有在这里扮演逗号的角色...
问题是由String[]
创建的splitCommand(GitNotifier gn)
。它似乎由单个String
项组成,即"git log -1 HEAD"
,可以很好地在控制台中手动输入,但不适用于ProcessBuilder
。
A ProcessBuilder
有两个构造函数:
ProcessBuilder(List<String> command)
和
ProcessBuilder(String... command)
您仅使用第二个选项,其中参数中的第一项被认为是可执行文件,而所有其余选项都被视为对该可执行文件的调用参数。这显然不同于将参数化调用作为String
复制到打开的控制台中,这可能是由于空格引起的,但这只是一个猜测。
必须通过创建将正确的参数与可执行文件分开,>
String[] command = {"git", "log", "-1", "HEAD"};
并将其传递给构造函数:
new ProcessBuilder(command)
,因为String...
是(或将转换为)String[]
。
但是,splitCommand(GitNotifier gn)
不会创建相同的String[]
(检查其长度,很可能是1
),这就是呼叫无法正常工作的原因。