Gerar arquivo .class

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.

Flw.

Se puder usar o Java 6.0, você pode acessar o “javac” via código mesmo:

http://java.sun.com/javase/6/docs/api/javax/tools/package-summary.html#package_description

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…

http://www.guj.com.br/java.tutorial.artigo.145.1.guj

[]'s.

Era isso mesmo pessoal, vou dar uma testada aqui.

Se ficar ok ou tiver alguma duvida torno a postar!

Vlw.

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.

Alguém sabe algo a respeito?

Abraço.

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.

http://www.javalobby.org/java/forums/m91985882.html

Um método chamado


JavaCompilerTool compiler = ToolProvider.defaultJavaCompiler();
compiler.setOutputDirectory(new File("c:/temp2/output"));

Aparentemente tudo ok

Dai veio o problema.

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);
         }
    }

Vlw pela força.

Abraço.