2012-02-02 5 views
5

Привет, У меня есть требование для создания, компиляции и загрузки классов Java-классов. Используя FTL, я создаю исходные файлы java и могу скомпилировать источник, если нет динамической зависимости.Использование Java Compiler API для компиляции нескольких java-файлов

Чтобы разработать экземпляр, у меня есть два исходных файла java, один интерфейс и его класс реализации. Я могу компилировать интерфейс с помощью Java API компилятора следующей

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(); 

Я установил путь класса для статических классов, которые уже находятся в пути к классам, но этот подход не работает для динамически создаваемых классов? Любой пользовательский загрузчик классов выполнит исправление? Моя последняя реализация будет в веб/сервера приложений

Любая обратная связь будет высоко оценен

Satheesh

ответ

6

Я был в состоянии решить эту проблему путем компиляции всех файлов Java вместе. Использование FTL я генерировать классы Java, а затем скомпилировать его с помощью Java API компиляции и загрузки классов с настраиваемыми загрузчика классов

Java компилятором

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(); 

    } 

Ниже фрагмент кода показывает, как использовать пользовательский загрузчик классов

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; 
    } 
} 

благодаря Satheesh

+0

После определения класса вам необходимо его решить. –