进程构建器将找不到我的文件

时间:2016-02-15 08:17:21

标签: java processbuilder

我正在尝试使用ProcessBuilder编译java程序,但每当我看到控制台上出现此错误时,即使该文件存在于该路径中。

错误

  

java.io.IOException:无法运行程序“javac   /Users/foo/Desktop/online-compiler/user1455523443383/Main.java“:   error = 2,没有这样的文件或目录

@Override
    public ProgramResult executeProgram(File program) throws IOException {
        String parent = program.getParentFile().getParentFile().getAbsolutePath();
        String[] commands = new String[]{
            "javac "+program.getAbsolutePath(),
//            "cd "+parent,
//            "java -cp  "+parent+" "+PACKAGE_NAME+"."+MAIN_CLASS
        };

        ProcessBuilder builder = new ProcessBuilder(commands);
        builder.redirectErrorStream(true);

        Process executorProcess = builder.start();

        BufferedReader reader = new BufferedReader(new InputStreamReader(executorProcess.getInputStream()));
        String line;
        StringBuilder sb = new StringBuilder();
        while((line = reader.readLine())!=null) {
            sb.append(line);
        }
        reader.close();

        ProgramResult result = new ProgramResult();
        result.setOutput(sb.toString());

        return result;
    }

更多信息

Javac在路径上,因为通过ProcessBuilder运行它(没有文件)正在打印帮助选项。

操作系统:MACOSX

  

这个问题的结论是

1)ProcessBuilder需要命令的每个参数作为单独的索引,比如执行“javac filename.java”你写这个

new String[] {"javac" , "filename.java"}

2)要执行多个命令,您应该使用以下技巧

new String[]{
               "/bin/bash",
                "-c",
                "javac "+
                program.getAbsolutePath()+
                " &&" +
                " java -cp " +
                parent +
                " "+ PACKAGE_NAME+"."+MAIN_CLASS,
}

非常感谢@kucing_terbang与我一起解决这个问题。

2 个答案:

答案 0 :(得分:3)

AFAIK,如果你想把一个参数放到ProcessBuilder中,你应该把它放入数组的另一个索引。

因此,请尝试将command变量更改为类似的内容,然后重试。

String[] commands = new String[]{"javac", program.getAbsolutePath()};

答案 1 :(得分:1)

如果要编译Java类,最好使用从JavaCompiler获取的ToolProvider.getSystemJavaCompiler();

JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler(); javaCompiler.run(null, null, null, program.getAbsolutePath());