Como compilar código Java desde una clase Java
Compartir la entrada "Como compilar código Java desde una clase Java"
Días atras dandole un vistazo a la Java API, me encontre con una interfaz que no tenia idea que existiera y es la interfaz JavaCompiler. A continuación un ejemplo sencillo de como compilar una clase:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.io.IOException; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; public class JavaCompilerExample { public static void main(String args[]) throws IOException{ //Obtenemos el compilador Java del sistema JavaCompiler compiler =ToolProvider.getSystemJavaCompiler(); //Ejecuta la compilacion int results = compiler.run(null, null, null, "C:/Example.java"); System.out.println("Success: " + (results == 0)); } } |
Para el ejemplo anteriormente mostrado, asumimos que hemos codificado una clase y ubicada en c:/Example.java. Como mi idea es demostrar como compilar, le dejo a ustedes la tarea de crear una clase cualquiera, con y sin errores para poder observar la salida de la ejecución de este programa.
Brevemente comento del código.
- Clase ToolProvider, disponible desde la versión 6, esta clase nos permite obtener proveedores de compiladores.
- Invocación del método run, método heredado de la interfaz Tool (presente desde la versión 6 de Java), es una interfaz utilizada para invocar programas, y en nuestro caso la utilizamos para la invocación del compilador. Incluso podríamos obtener las versiones soportadas por la herramienta invocando el método getSourceVersions();
La anterior no es la única forma de poder llevar a cabo la compilación, he aquí otro ejemplo, pero en este caso usando métodos propios de la interfaz JavaCompiler.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; import javax.tools.JavaCompiler.CompilationTask; public class JavaCompilerExample2 { public static void main(String args[]) throws IOException{ //Obtenemos el compilador Java del sistema JavaCompiler compiler =ToolProvider.getSystemJavaCompiler(); String sourceFile = "C:/Example.java"; //Obtenemos manejador estandar de ficheros StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); List sourceFileList = new ArrayList(); sourceFileList.add(new File(sourceFile)); Iterable compilationUnits = fileManager .getJavaFileObjectsFromFiles(sourceFileList); //Obtenemos la tarea de compilación a ejecutar posteriormente CompilationTask task = compiler.getTask(null, fileManager, null, null, null, compilationUnits); //Ejecutamos la tarea boolean result = task.call(); if (result) System.out.println("La compilación ha sido exitosa"); else System.out.println("La compilación ha fallado"); fileManager.close(); } } |
Esta ultima forma de llevar a cabo la compilación, particularmente es de mi preferencia ya que nos permite mejorar en rendimiento, en el caso de que llevemos a cabo la compilación de un grupo de ficheros (archivos) mientras reutilicemos el gestor de archivos, además de poder pasarle de una forma mas ordenada las opciones de compilación.
NOTA: En este segundo ejemplo también dejo de parte de ustedes la creación del fichero a compilar (C:/Example.java), que en este caso he hecho uso del mismo en ambos ejemplos.
espero les pueda ser de utilidad, incluso podríamos hasta crearnos nuestro propio IDE, donde compilemos y a su vez nos muestre los mensajes de error en caso de haberlos.
Compartir la entrada "Como compilar código Java desde una clase Java"
Mientras lei pensaba en la utilidad de tal interface, hasta que lei tu ultimo comentario sobre un IDE. Aparte del compilador Java, se puede llamar a un compilador C/C++ o en ese caso seria un simple run()?