2012-02-02 30 views
5

Hola Tengo el requisito de crear, compilar y cargar clases Java. Usando FTL estoy creando archivos fuente de Java, y puedo compilar el código fuente si no hay una dependencia dinámica.Uso de Java Compiler API para compilar varios archivos java

Para elaborar con una instancia, tengo dos archivos fuente java, una interfaz y su clase de implementación. Soy capaz de compilar la interfaz API usando compilador de Java de la siguiente manera

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

puse ruta de clase para las clases estáticas que ya se encuentran en la ruta de clase, pero este enfoque no trabajo para las clases creadas dinámicamente? ¿Algún cargador de clases personalizado hará la corrección? Mi aplicación final será en el servidor web/app

Cualquier comentario será muy apreciada

Satheesh

Respuesta

6

yo era capaz de resolver este problema mediante la compilación de todos los archivos juntos java. Usando FTL genero las clases Java, y luego compilarlo usando las clases de API de Java compilador y de carga con cargador de clases personalizadas

Java Complier

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

    } 

A continuación fragmento de código muestra cómo utilizar el cargador de clases personalizada

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

gracias Satheesh

+0

Después de definir una clase, necesita resolverla. –

Cuestiones relacionadas