Compiler API of Mustang

Um dos freatures interessantes do java 6.0(Mustang) é a Java Compiler API resultante da JSR 199. Vou mostrar um exemplo de como usar essa API, esta api nos permite usar a compilação de artefatos java de uma maneira mais elegante sem precisarmos invocar o javac via algum CLI da vida. Além de proporcionar compilação de código java em uma String em memória e listeners java compilação.



Esta é a classe java que eu quero compilar.

package org.diegopacheco.java6comilerapi.model;

public class Hello {
     public static void main(String[] args) {
          System.out.println("Ola mundo");
     }
}


Este é a classe java que irá compilar a classe Hello.java

package org.diegopacheco.java6compilerapi.util;

import java.io.File;
import java.io.IOException;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

/**
 * Classe que mostra como usar o recurso de compilar artefatos java
 * de dentro de artefatos java, essa funcionalidade é provida pela JSR 199.
 * @author Diego Pacheco
 *
 */
public class CompilerTestHello {
     
     private static String projectPath = "";     
     private static String outputDir = "";
     private static String pachage   = "/org/diegopacheco/java6comilerapi/model/";
     static{
          try {
               projectPath  = new File(".").getCanonicalPath() + "/src/java";
               outputDir    = new File(".").getCanonicalPath() + "/compiled";
          } catch (IOException e) {          
               e.printStackTrace();
               throw new RuntimeException("Erro ao buscar o path do projeto. EX: " + e.getMessage());
          }
     }

     public static void main(String[] args) {
          
          String fileToCompile = java.io.File.separator + projectPath + pachage + "Hello.java";          
          JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();          
          
          int result = compiler.run(null, null, null,"-d",outputDir, fileToCompile);
          if(result==0){
               System.out.println("Compilação feita com sucesso!");
          }else{
               System.out.println("Erro, não foi possivel compilar");
          }
          
     }
}


Simples. Mas espero que eles melhorem o design desta api, pois retornar 0 ou 1 para dizer se compilou não me parece uma boa abordagem para uma api de alto nível feita em java. Espero que eles criem uma arvore de execptions no futuro.

Até

Popular posts from this blog

Kafka Streams with Java 15

Rust and Java Interoperability

HMAC in Java