我正在尝试使用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与我一起解决这个问题。
答案 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());