0

我正在尝试使用 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",
              };
4

3 回答 3

2

您传递给 ProcessBuilder 的字符串数组应该包含每个数组元素的一个参数,而不是单个大字符串中的所有内容。

尝试这个:

字符串 [] 命令 = 新字符串 []
{
  "C:\\Windows\\System32\\cmd.exe",
  “/C”,
  "C:\\\"程序文件\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
};

顺便说一句:不需要调用cmd.exe,可以直接将javac.exe传给ProcessBuilder

ProcessBuilder 构建器 = 新的 ProcessBuilder(
   "C:\\\"程序文件\"\\Java\\jdk1.6.0_23\\bin\\javac.exe", "\\Path\\To\\MyClass.java"
);
于 2011-02-13T15:44:00.427 回答
1

你必须从process.getInputStream()自己身上阅读。据我所知,进程的输出不会自动显示在标准输出上。

于 2011-02-13T18:09:44.670 回答
0

您使用了错误的流程构建器方法。使用单字符串版本,即不传递字符串数组,只传递字符串。字符串数组版本适用于您已经将命令划分为程序、其选项和参数的情况。就目前而言,它正在寻找一个名为C:\\Windows\\System32\\cmd.exe /c C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe.

或者,将您的命令拆分为字符串数组中的程序和参数,然后您可以使用进程构建器的字符串数组版本。

String[] = new String[] {
    "C:\\Windows\\System32\\cmd.exe",
    "/c",
    "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe"
}

于 2011-02-13T15:41:10.227 回答