死灵但是:不要使用Runtime.exec(String)
超载。根据 javadoc https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#exec-java.lang.String- (间接) https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#exec-java.lang.String-java.lang.String:A-java.io.File-它标记了命令任何空白 https://docs.oracle.com/javase/8/docs/api/java/util/StringTokenizer.html#StringTokenizer-java.lang.String-如果您直接通过 CMD(或 Unix shell)输入此命令行,则忽略适用的引用规则。然后,Windows 执行器根据令牌重建命令行,但多余的空格会丢失。
相反,使用String[]
正确解析的重载:
p = runtime.exec(new String[]{"cmd","/c","java","-cp",classpath,classname,"hello world"});
或者您实际上并没有在这里使用 CMD 的任何功能,因此您不需要它:
p = runtime.exec(new String[]{"java","-cp",classpath,classname,"hello world"});
如果你使用ProcessBuilder https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html相反,它的 ctor 和.command(setter)
被声明为String...
(vararg) 所以你可以直接传递令牌而不需要写new String[]{...}
.
或者,运行 CMD 并将命令行指定为input:
p = runtime.exec("cmd"); // or new ProcessBuilder + start
String line = "java -cp " + classpath + " " + classname + " \"hello world\"\n";
p.getOutputStream.write(line.getBytes());
(对于这种方法,CMD 的输出将包括输入的横幅、提示和回显。)