Process builder 找不到我的文件

Process builder won't find my file

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

错误

java.io.IOException: Cannot run program "javac /Users/foo/Desktop/online-compiler/user1455523443383/Main.java": error=2, No such file or directory

@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 正在打印帮助选项。

OS : MACOSX

Conclusions from this questions are

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 和我一起深入挖掘这个问题来解决它。

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

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

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

如果你想编译一个Javaclass,最好使用从ToolProvider.getSystemJavaCompiler();

获取的JavaCompiler

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