2011-02-13 72 views
0

我试图使用ProcessBuilder从Java执行javac,但是我没有输出,也没有任何反应。我尝试阅读输入流(因为如果我没有阅读它,有一个进程挂起的错误),但仍然没有结果。我最初将所有必需的参数传递给了javac,但它不起作用,所以我简化为javac(它应该打印帮助信息)。无法在Windows下使用ProcessBuilder在Java中执行javac或其他命令行应用程序7

我试图运行 “C:\ WINDOWS \ SYSTEM32 \ CMD.EXE/C C:\\” 程序文件\ “\的Java \ jdk1.6.0_23 \斌\的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 \斌\的javac.exe”: CreateProcess错误= 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", 
       }; 
+0

有点晚了,但我不认为这个`C:\“Program Files”\ Java \ ...`路径看起来是正确的。要么把报价放在完整的道路上,要么放弃。 – 2011-06-02 15:23:48

回答

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" 
} 

而且

+0

我试过这个,现在我没有得到一个错误,但仍然没有从标准输入或错误流的javac输出。当我提供classpath参数时,它也不会产生任何编译文件。 – Coder 2011-02-13 15:51:21

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" 
); 
+0

我试过了你的第一个建议,现在我没有得到一个错误,但在标准输入或错误流上仍然没有javac的输出。当我提供classpath参数时,它也不会产生任何编译文件。 – Coder 2011-02-13 15:51:53

+0

我已经尝试过你的第二个建议,它会产生“线程中的异常”Thread-2“java.lang.AssertionError:无法编译文件,无法运行程序”C:\“Program Files”\ Java \ jdk1.6.0_23 \ bin \ javac.exe“:CreateProcess错误= 5,访问被拒绝”。顺便说一句,我通过NetBeans 6.9.1中的JUnit测试来运行这个。 – Coder 2011-02-13 15:54:32

1

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

相关问题