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());
我正在尝试使用 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());