Tôi muốn biên dịch mã nguồn mà không cần phụ thuộc vào máy.
Ví dụ: File A.java:
JavaCompiler với ClassLoader tùy chỉnh và FileManager
import some.pkg.B;
public class A extends B {...}
tôi không có nguồn B hiện tại, tôi muốn treo hoặc JavaFileManager hoặc một ClassLoader tùy chỉnh để có được những biểu tượng trong câu hỏi (gói 'một số. gói 'và lớp B) và sau đó sử dụng dịch vụ tôi có để truy xuất chuỗi nguồn.
Mã biên soạn: (inputFiles có A.java)
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
CustomClassLoader classLoader = new CustomClassLoader();
StandardJavaFileManager standardfileManager = compiler.getStandardFileManager(this, null, null);
JavaFileManager fileManager = new CustomFileManager(standardfileManager, output, classLoader);
CompilationTask task = compiler.getTask(null, fileManager, this, null, null, inputFiles);
boolean result = task.call();
Hooks trên JavaFileManager (getFileForInput ..) và trên classloader của tôi (findClass, loadClass ..) không kích hoạt khi biên soạn và tôi nhận thông báo lỗi:
A.java:#: package some.pkg does not exist
A.java:#: cannot find symbol
symbol: class B
EDIT
Sau khi chơi đùa với các API, đi qua JavaCompiler (phiên bản cũ) s ource và đọc Compilation Overview Tôi vẫn không thể tìm thấy một móc API tôi có thể sử dụng để cung cấp cho tôi Biểu tượng từ các cây cú pháp. Dường như API cần lấy tất cả các tài nguyên dựa trên tên gói như được gợi ý bởi kschneid.
Một cách giải quyết khác mà tôi nghĩ đến là chạy JavaCompiler và phân tích các thông báo lỗi cho các ký hiệu bị thiếu. Bằng cách đó tôi sẽ biết những biểu tượng nào là cần thiết, lấy chúng và biên dịch lại.
Bất kỳ cách giải quyết/giải pháp nào khác?
gì JDK phiên bản/biên dịch và nền tảng mà bạn đang sử dụng? – matts
JavaCompiler (javac), JDK 1.6.30 x64 trên Windows. –
Tôi không hoàn toàn chắc chắn. Nhưng, tôi cảm thấy như thể những gì bạn đang cố gắng làm là tải lớp động. Bạn không thể sử dụng 'Class.forname()' để nạp lớp vào thời gian chạy. Hãy sửa tôi nếu tôi hiểu lầm. – Ankit