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:
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");
|

Deja un comentario