Compilar clases Java desde otra clase Java

Si os habéis encontrado con la dificultad de compilar clases Java desde otra clase Java seguro que habéis llegado al Runtime.getRuntime().exec(“javac …”):

private static void runProcess(String command) throws Exception {

Process pro = Runtime.getRuntime().exec(command);

printLines(command + " stdout:", pro.getInputStream());

printLines(command + " stderr:", pro.getErrorStream());

pro.waitFor();

System.out.println(command + " exitValue() " + pro.exitValue());

}

public static void main(String[] args) {

try {

runProcess("javac Main.java");

runProcess("java Main");

} catch (Exception e) {

e.printStackTrace();

}

}

Además de esta solución, operativa en la mayoría de los casos, hay otras opciones más exóticas o adecuadas según el escenario, como:

JavaCompiler:

public class JCompiler {
 public static void main(String[] args) throws IOException {
 File dir = new File("directory-path");
 File[] javaFiles = dir.listFiles(
 new FilenameFilter() {
 public boolean accept(File file, String name) {
 return name.endsWith(".java");
 }
 });
 
 JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
 DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
 StandardJavaFileManager fileManager = javaCompiler.getStandardFileManager(diagnostics, Locale.GERMANY, Charset.forName("UTF-8"));
 Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(javaFiles));
 javaCompiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits).call();
 
 for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
 System.out.format("Error on line %d in %d%n", diagnostic.getLineNumber(), diagnostic.getSource().toString());
 } 
 
 fileManager.close();
 }
}

JDTCompiler: El compilador de Tomcat

Apache Commons CDI: Compilation:

JavaCompiler compiler = new JavaCompilerFactory().createCompiler("eclipse");
CompilationResult result = compiler.compile(sources, new FileResourceReader(sourceDir), new FileResourceStore(targetDir));

System.out.println( result.getErrors().length + " errors");
System.out.println( result.getWarnings().length + " warnings");

Humor:Cuando veo una página HTML con los tags sin cerrar!

Publicado en Humor. 1 Comment »
A %d blogueros les gusta esto: