2012-02-02 13 views
5

Witam Mam wymagania do tworzenia, kompilowania i ładowania klas uruchamiania java. Korzystając z FTL, tworzę pliki źródłowe java i mogę skompilować źródło, jeśli nie ma zależności dynamicznej.Używanie Java Compiler API do kompilowania wielu plików Javy

Aby opracować za pomocą instancji, mam dwa pliki źródłowe java, jeden interfejs i jego klasa implementacji. Jestem w stanie skompilować interfejsu za pomocą kompilatora Java API następująco

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

ustawić ścieżkę klasy dla klas statycznych, które są już w ścieżce klasy, ale takie podejście nie działa na dynamicznie tworzonych klas? Każdy niestandardowy program ładujący klasy zrobi poprawkę? Moja ostateczna realizacja będzie w web/aplikacji serwera

Wszelkie uwagi będą bardzo mile widziane

Satheesh

Odpowiedz

6

udało mi się rozwiązać ten problem poprzez gromadzenie wszystkie pliki Java razem. Korzystanie FTL wygenerować klas Java, a następnie skompilować go przy użyciu klas Java kompilator API i obciążeń z ładowaczem niestandardowej klasy

Java kompilator

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

    } 

Poniżej fragment kodu pokazuje, jak używać niestandardowej klasy ładowarka

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

dzięki Satheesh

+0

Po zdefiniowaniu klasy musisz ją rozwiązać. –

Powiązane problemy