2012-02-02 36 views
5

Xin chào Tôi có yêu cầu tạo, biên dịch và tải các lớp java chạy thời gian. Sử dụng FTL tôi đang tạo các tệp nguồn java và có thể biên dịch nguồn nếu không có sự phụ thuộc động.Sử dụng Java Compiler API để biên dịch nhiều tệp java

Để xây dựng với một cá thể, tôi có hai tệp nguồn java, một giao diện và lớp triển khai của nó. Tôi có thể biên dịch các giao diện sử dụng java biên dịch api như sau

String classpath=System.getProperty("java.class.path"); 
     String testpath =classpath+";"+rootPath+"/lib/is_wls_client.jar;"+rootPath+"/rtds_wls_proxyclient.jar;.;"; 
     File javaFile = new File(javaFileName+".java"); 
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
     List<String> optionList = new ArrayList<String>(); 
     optionList.addAll(Arrays.asList("-classpath",testpath)); 
     StandardJavaFileManager sjfm = compiler.getStandardFileManager(null, null, null); 
     Iterable fileObjects = sjfm.getJavaFileObjects(javaFile); 
     JavaCompiler.CompilationTask task = compiler.getTask(null, null, null,optionList,null,fileObjects); 
     task.call(); 
     sjfm.close(); 

tôi đặt đường dẫn lớp cho các lớp học tĩnh mà đã có trong classpath, nhưng phương pháp này không làm việc cho các lớp học năng động tạo ra? Bất kỳ trình nạp lớp tùy chỉnh nào sẽ thực hiện việc sửa lỗi? thực hiện cuối cùng của tôi sẽ được ở máy chủ web/app

Bất kỳ thông tin phản hồi sẽ được đánh giá cao

Satheesh

Trả lời

6

tôi đã có thể giải quyết vấn đề này bằng cách biên dịch tất cả các tập tin java với nhau. Sử dụng FTL tôi tạo ra các lớp java, và sau đó biên dịch nó sử dụng các lớp biên dịch java api và tải với lớp tùy chỉnh bộ nạp

Java biên dịch

private void compile(File[] files) throws IOException{ 
     String classpath=System.getProperty("java.class.path"); 
     String rootPath=getServletContext().getRealPath("/"); 
     System.out.println("--> root Path "+rootPath); 
     String testpath=classpath+";.;xx.jar;yy.jar"; 
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
     List<String> optionList = new ArrayList<String>(); 
     optionList.addAll(Arrays.asList("-classpath",testpath)); 
//  optionList.addAll(Arrays.asList("-d",rootPath+"/target")); 
     StandardJavaFileManager sjfm = compiler.getStandardFileManager(null, null, null); 
     Iterable fileObjects = sjfm.getJavaFileObjects(files); 
     JavaCompiler.CompilationTask task = compiler.getTask(null, null, null,optionList,null,fileObjects); 
     task.call(); 
     sjfm.close(); 

    } 

Dưới đoạn mã cho thấy làm thế nào để sử dụng lớp tùy chỉnh bộ nạp

class CustomClassLoader extends ClassLoader { 

    public CustomClassLoader(ClassLoader parent) { 
      super(parent); 
    } 

    public Class findClass(String className,String path) { 
     byte[] classData = null; 
     try { 
      FileInputStream f = new FileInputStream(path); 
      int num = f.available(); 
      classData = new byte[num]; 

      f.read(classData); 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
     Class x = defineClass(className, classData, 0, classData.length); 
     return x; 
    } 
} 

nhờ Satheesh

+0

Sau khi xác định một lớp, bạn cần phải giải quyết nó. –

Các vấn đề liên quan