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.