我正在尝试使用 ProcessBuilder 从 Java 执行 javac,但我没有得到任何输出,也没有任何反应。我尝试读取输入流(因为如果我不读取它会出现进程挂起的错误),但仍然没有结果。我最初将所有必需的参数传递给 javac 但它不起作用,所以我将它简化为 javac (它应该打印帮助消息)。
我尝试运行 "C:\Windows\System32\cmd.exe /c C:\\"Program Files\"\Java\jdk1.6.0_23\bin\javac.exe" "C:\\"Program Files\"\ Java\jdk1.6.0_23\bin\javac.exe" 并用双引号将 javac 的整个路径括起来,但仍然没有。
我得到错误
无法运行程序 "C:\Windows\System32\cmd.exe /c C:\"Program Files"\Java\jdk1.6.0_23\bin\javac.exe": CreateProcess error=2, 系统找不到指定的文件
但是如果我复制命令并从命令行运行它,它工作正常。
我知道使用 JavaCompiler 类来编译我的文件,但我更愿意先解决这个问题,因为我无法从 Java 运行任何 dos 应用程序或 .bat 文件。我可以很好地运行像 notepad.exe 这样的 GUI 程序。
String[] commands = new String[]{
"C:\\Windows\\System32\\cmd.exe /c C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
};
logger.log(Level.INFO, "About to run javac with the command below:");
String commandToOutput = "";
for (String command : commands) {
commandToOutput += command + " ";
}
logger.log(Level.INFO, commandToOutput);
ProcessBuilder processBuilder = new ProcessBuilder(commands);
Process p = processBuilder.start();
编辑 2
String[] commands = new String[]{
"C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe", "-d", "\"" + tempDir + "\"", "-classpath", classpath
};
编辑 3
为什么第二个命令数组有效但第一个不在下面。
//this gives me CreateProcess error=5, Access is denied
commands = new String[]{
"C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
};
//this works
commands = new String[]{
"C:\\Windows\\System32\\cmd.exe",
"/c",
"C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe",
};