我尝试了这个,但它没有奏效。 我的启动命令提示符命令的方法:
public static void executeCommand(String command, String path){
File folder = new File(path);
ProcessBuilder pb = new ProcessBuilder(command);
pb.directory(folder.getAbsoluteFile());
pb.redirectErrorStream(true);
try{
pb.start();
}catch (IOException e){
e.printStackTrace();
}
}
`
以及调用方法的代码:
executeCommand("javac "+str+".java", path);
executeCommand("java "+str, path);
但是它抛出了IOException。我想知道这是否是错误的做法以及如何解决它。 " STR"是.java文件。路径是运行它的文件夹的路径。
答案 0 :(得分:1)
在Java中实际上有一种标准的方法 - 使用JavaCompiler类。但是,您的类路径中可以使用require that tools.jar
。
该页面上的文档只是可以帮助您入门,但为了完整起见,这是一个示例。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, Locale.US, Charset.defaultCharset());
File[] files = new File[]{new File("/path/to/java/source/file/you/want/to/compile")};
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
Iterable<? extends JavaFileObject> compilationUnits1 =
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files));
Boolean call = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits1).call();
for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
System.out.println(diagnostic);
}
System.out.println("compiled successfully: " + call);
如果您要编译整个目录的内容,那么您可能需要稍微更改一下数组:
File directory = new File("/path/to/directory");
File[] files = directory.listFiles();
答案 1 :(得分:0)
您需要说明javac和Java的位置,您传入的目录是文件的目录,而不是您要运行的进程的二进制文件的目录。完全限定javac / java或将目录设置为可执行文件的位置
答案 2 :(得分:0)
您正在获取IOException
java.io.IOException:无法运行程序“javac”:
您需要将参数分隔为单独的字符串,如下所示:
executeCommand(new String[]{"javac",str+".java"},path);
/\
||
Please notice No Space like this "javac "
^^
Remove(Space)
同样在executeCommand方法中更改参数列表,如下所示:
public static void executeCommand(String [] command, String path)
从"javac"
删除空格后,我刚刚尝试过并成功执行了程序。
执行命令的Alternatice方法
您可以使用Runtime#exec()方法
public static void executeCommand(String command){
try{
Process process = Runtime.getRuntime().exec(command);
InputStream error = process.getErrorStream();
InputStreamReader isrerror = new InputStreamReader(error);
BufferedReader br = new BufferedReader(isrerror);
String line=null;
while ((line = bre.readLine()) != null) {
System.out.println(line);
}
process.waitFor();
}catch (Exception e){
e.printStackTrace();
}
}
打电话给他们
executeCommand("javac "+str+".java");
executeCommand("java "+str);
我已经使用ErrorStream
检查我正在编译的.java文件中是否存在编译时错误