Bom dia pessoal, estou fazendo meu PG cheguei em uma parte que eu gero um arquivo .java até ai tudo bem.
O problema é que eu preciso a partir deste .java gerar um .class só que isso tem que ser feito no meu código.
Tipo tenho o seguinte código para que vocês entendam.
OutputStream os = new FileOutputStream("C:/" + classe + "Test.java");
FileWriter f = new FileWriter("C:/" + classe + "Test.java");
f.write("Aqui fica toda a String que eu escrevo dentro do meu arquivo .java - mas que não vem ao caso");
f.close();
Depois de gerar esse arquivo .java preciso compilar ele. pois depois disso vou ter que dar um load nesse class
Já dei dando uma lida em alguma coisa sobre a classe RunTime mas não sei se é esse o caminho que devo tomar.
Tipo chamar em tempo de execução o javac mas acho que é muita locura, deve ter um jeito melhor.
Se alguém puder ajudar ai com alguma dica, tutorial, caminho que devo tomar, link ou afins eu agradeço.
Não sei se entendi bem o que deseja fazer, mas pelo que eu entendi o principal problema aqui é compilar seus fontes em runtime, correto?
Se isso for verdade, existem um artigo aqui mesmo no GUJ falando sobre isso. Dá uma sacada pra ver se te ajuda…
Olá senhores, passei a tarde aqui na função. Tudo Ok mas ainda tenho uma duvida.
O código abaixo esta ok.
try {
// Cria um arquivo ... Test.java
OutputStream os = new FileOutputStream("C:\\Paulo\\ApplicationsNetBeans\\TesteSoftware\\test\\br\\com\\tcc\\control\\"
+ classe + "Test.java");
// Direciona o writer para escrever dentro do arquivo criado
FileWriter f = new FileWriter("C:\\Paulo\\ApplicationsNetBeans\\TesteSoftware\\test\\br\\com\\tcc\\control\\"
+ classe + "Test.java");
// deixa um log da compilacao em um arquivo chamado log.txt
PrintWriter saida = new PrintWriter(new FileWriter("c:/log.txt"));
/* saida é onde sera gravada a saida do compilador (erros por exemplo),
* em vez de usar a saída padrão System.out
* */
// escreve o codigo-fonte no arquivo
f.write(new GeraClasseTeste().montaClasse(cls, classe));
// fecha a escrita e o arquivo
f.close();
int resultadoCompilacao = com.sun.tools.javac.Main.compile(
new String[]{"C:\\Paulo\\ApplicationsNetBeans\\TesteSoftware\\test\\br\\com\\tcc\\control\\"
+ classe + "Test.java"}, saida);
if (resultadoCompilacao == 0) {
JOptionPane.showMessageDialog(null, "Criou o arquivo .class sem nenhum Erro");
}
saida.close();
} catch(IOException ioe) {
System.out.println("Erros ao gravar arquivo: \n"+ioe.getMessage());
ioe.printStackTrace();
}
Minha duvida é a seguinte pessoal.
Como faço para gerar o .class em um diretório diferente do .java.
Dei uma lida na documentação que me mandaram e consegui gerar o .class blz só preciso gerar ele em outro diretório agora mas não achei nada que falasse a respeito.
Por exemplo a Ide quando você cria uma classe de teste com JUnit e roda a classe o .class é gerado dentro de um diretório buil/test dentro do pacote.
Só preciso descobrir como criar em um diretório separado agora.
Dai pessoal andei dando uma boa pesquisada inclusive mandando uns e-mail para o exterior mas não encontrei nenhuma alma que me ajudasse a gerar um .class através do .java no diretório que eu queria.
Encontrei esse link que a pincipio tinha o que eu procurava.
Precisava de uma classe que segundo o autor estava no tools.jar que fica no diretório lib da jdk
Essa é a bendita.
javax.tools.JavaCompilerTool;
Blz vasculhei esse jar e nada dessa classe achei que poderia ser a minha versão do java, pois bem baixei acho que todas as versões hehe mas não encontrei, dai mandei e-mail pro autor desse artigo mas ele não respondeu.
Se alguém tem alguma explicação para me dar a respeito dessa classe que deveria estar no tools.jar mas não encontrei.
Acabei desistndo
Então fiz copiando o arquivo mesmo.
Se alguém se interessar.
Segue o código.
public void geraClasseTeste (String classe, Class cls) {
montaClasse(cls, classe);
try {
String path = "c:/Development/ApplicationsNetBeans/TesteSoftware/src/br/com/tcc/view/" + classe;
OutputStream os = new FileOutputStream(path + "Test.java");
FileWriter f = new FileWriter(path + "Test.java");
PrintWriter saida = new PrintWriter(new FileWriter("c:/log.txt"));
f.write(new GeraClasseTeste().montaClasse(cls, classe));
f.close();
int resultadoCompilacao = com.sun.tools.javac.Main.compile(
new String[]{path + "Test.java"}, saida);
if (resultadoCompilacao == 0) {
String srcFileName = path + "Test.class";
String dstFileName = "C:/Development/ApplicationsNetBeans/TesteSoftware/build/classes/br/com/tcc/view/"
+ classe + "Test.class" ;
copyFile(srcFileName, dstFileName);
JOptionPane.showMessageDialog(null, "Criou o arquivo .class sem nenhum Erro");
} else {
JOptionPane.showMessageDialog(null, "Erro ao tentar compilar a classe");
}
saida.close();
}
catch (Throwable e) {
System.err.println("Erro ao tentar gerar classe de teste " + e);
// e.printStackTrace();
}
}
public void copyFile(String srcFileName, String dstFileName) {
try {
FileChannel srcChannel =
new FileInputStream(srcFileName).getChannel();
FileChannel dstChannel =
new FileOutputStream(dstFileName).getChannel();
dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
srcChannel.close();
dstChannel.close();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Unable to copy file.", e);
}
}