无法使用Windows 7下的ProcessBuilder在Java中执行javac或其他命令行应用程序

时间:2011-02-13 15:37:13

标签: java executable javac processbuilder

我正在尝试使用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:\”程序文件“\ 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",
              };

3 个答案:

答案 0 :(得分:2)

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

试试这个:

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

顺便说一下:没有必要调用cmd.exe,可以直接将javac.exe传递给ProcessBuilder

ProcessBuilder builder = new ProcessBuilder(
   "C:\\\"Program Files\"\\Java\\jdk1.6.0_23\\bin\\javac.exe", "\\Path\\To\\MyClass.java"
);

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

并且