Tôi đã thử nó nhưng nó không hoạt động. Cách tôi khởi chạy lệnh nhắc lệnh:
public static void execCommand(Lệnh chuỗi, Đường dẫn chuỗi){
Thư mục tệp = Tệp mới (đường dẫn);
ProcessBuilder pb = new ProcessBuilder(lệnh);
pb.directory(folder.getAbsoluteFile());
pb.redirectErrorStream(true);
try{
pb.start();
}bắt (IOException e){
e.printStackTrace();
}
}
`
Và mã để gọi phương thức:
execuCommand("javac "+str+".java", đường dẫn);
execuCommand("java "+str, path);
Nhưng nó ném IOException. Tôi muốn biết liệu đây có phải là cách tiếp cận sai hay không và cách khắc phục. "str" là tệp .java. Đường dẫn là đường dẫn đến thư mục nơi nó được chạy.
Trên thực tế, có một cách tiêu chuẩn để thực hiện việc này trong Java - sử dụng Trình biên dịch Javalớp học. Bạnyêu cầu điều đó công cụ.jar
Tuy nhiên, nó có sẵn trên đường dẫn lớp của bạn.
Tài liệu trên trang nàySẽ giúp bạn bắt đầu, nhưng để hoàn thiện, đây là một ví dụ.
Trình biên dịch JavaCompiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = trình biên dịch.getStandardFileManager(null, Locale.US, Charset.defaultCharset());
File[] files = new File[]{new File("/path/to/java/source/file/you/want/to/compile")};
DiagnosticCollector chẩn đoán = new DiagnosticCollector<>();
Có thể lặp lại mở rộng JavaFileObject> trình biên dịchUnits1 =
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files));
Cuộc gọi Boolean = trình biên dịch.getTask(null, fileManager, chẩn đoán, null, null, biên dịchUnits1).call();
for (Chẩn đoán chẩn đoán : Diagnostics.getDiagnostics()) {
System.out.println(chẩn đoán);
}
System.out.println("biên dịch thành công: " + call);
Nếu bạn muốn biên dịch nội dung của toàn bộ thư mục thì bạn cần thay đổi mảng một chút:
Thư mục tệp = Tệp mới("/path/to/directory");
Tệp [] tệp = thư mục.listFiles();
Tôi là một lập trình viên xuất sắc, rất giỏi!