Relatórios não são exibidos no arquivo executável

11 respostas
marcos3

Pessoal, gostaria que me auxiliassem numa dúvida de iniciante… criei meu projeto usando o netbeans, os relatórios através do iReport-1.3.2. E quando estou “dentro” do netbeans e dou um “shift+f6” ao acessar os menus que chamam os relatórios, estes são exibidos normalmente. Porém quando ao construir o projeto (geração do arquivo executável da aplicação) os relatórios não são exibidos.

Como faço para resolver isso?

11 Respostas

R

precisamos ver códigos pra saber onde ta o problema… como nao sou usuario do netbeans, nao sei o que pode ser o shift+f6

pelo que entendi o problema nao ta nos relatorios e sim, no menu que gera o relatorio, é isso?

marcos3

“shif+f6”= é uma combinação de teclas que executa a aplicação.

Quando executo a aplicação dentro do netbeans, e acesso o menu de relatórios, estes são exibidos normalmente.

Porém quando crio o executável, e acesso o menu dos relatórios não é exibido nenhum deles.

Os relatórios (arquivo .jasper) estão dentro da pasta “src/relatorios/”

Classe relatório:

package relatorios;

import java.sql.SQLException;
import java.util.HashMap;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;
import utilitarios.conexao;

public class relCompleto{
    
    conexao con = new conexao();
    
    public relCompleto(){
        try{
            con.conecta();
            con.executaSQL("Select * from contatos");
        
            JRResultSetDataSource jrs= new JRResultSetDataSource(con.resultset);
            JasperPrint jsprint=JasperFillManager.fillReport("src/relatorios/rel_completo.jasper",new HashMap(),jrs);
            JasperViewer.viewReport(jsprint,false);
        
        }
        catch (Exception erro){
            JOptionPane.showMessageDialog(null,"Erro ao criar relatório!\n"+erro);
        }
        
    }
    
    public static void main(String args[]){
        new relCompleto();        
    }
    
}

Instrução para exibir o relatório ja na tela principal da aplicação:

private void mnitm_rel_completoActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        new relatorios.relCompleto();
    }

Repetindo… gerei o executável do meu projeto, porém os relatórios não são exibidos.

Acredito que deve estar relacionado com o caminho até os arquivos .jasper, mas não sei como isto poderia ser solucionado.

Acabei de fazer um teste que li em alguns blogs, onde diziam que a pasta que contém os .jasper deveria ser copiada para dentro da pasta lib depois que o projeto fosse compilado e gerado o executável, mas também não resolveu meu problema.

orlandocn

troque a linha:

JasperPrint jsprint=JasperFillManager.fillReport("src/relatorios/rel_completo.jasper",new HashMap(),jrs);

por algo como:

JasperPrint jsprint=JasperFillManager.fillReport(getClass().getResourceAsStream("relatorios/rel_completo.jasper"), parametros, jrs);
marcos3

Orlandocn, valeu pela atenção.

Porém utilizei uma outra forma em que consegui resolver o problema…

1- coloquei os arquivos .jasper (o aplicativo gera vários relatórios) no caminho: “src/relatorios/”

2- botão direito em cima do nome do projeto, fui em “propriedades”, depois opção “biblioteca”, na sequencia “adicionar jar/pasta” e adicionei todas as bibliotecas do ireport que utilizei no projeto.

3- após gerar o executável, é criada a pasta “dist”, aí colei dentro dela a pasta “src/relatorios”

Pronto! Agora os relatórios são emitidos normalmente a partir do executável. Já o fiz o teste levando este executável para outras máquinas e funcionou.

Enfim, acredito que não deve ser a solução que os profissionais usam, mas por hora resolverá o problema.

orlandocn

a questão é que você apenas contornou o problema ao invés de resolve-lo. Quando você usa:

getClass().getResourceAsStream("relatorios/rel_completo.jasper")

você estaria procurando o relatório dentro do seu jar, sem necessidade de arquivos externos

marcos3

Fiz esta alteração no meu código, porém ao executar (mesmo dentro do netbeans) me retorna a seguinte mensagem de erro:

[color=darkred] java.lang.NullPointerException[/color]

Meu código ficou assim:

JasperPrint jsprint=JasperFillManager.fillReport(getClass().getResourceAsStream("relatorios/rel_completo.jasper"),new HashMap(),jrs);
orlandocn

e dentro do seu jar existe uma pasta “relatorios” contendo um arquivo “rel_completo.jasper”?

marcos3

Nem cheguei a gerar o executável desta vez, pois tentei executar a classe após tal mudança e como não consegui, já foi apresentado este erro… acreditando que seja necessário corrigí-lo para então gerar o executável.

marcos3

Acabei de gerar o arquivo jar e existe lá a pasta “relatorios” com os arquivos .jasper dentro e mesmo assim a mensagem de erro persiste.

R

eu sempre enviei o caminho por parametro para os relatorios… como seus relatorios estão prontos, é inviavel fazer isso

sugiro vc testar esses métodos de descobrir caminhos em uma classe separada… cria uma classe de teste com main e tal e dai cria um File, usa o getResourceAsStream por exemplo e com o metodo file.exists() e com uma exception vc verifica se deu certo…

dai usa no seu relatorio :wink:

marcos3

orlandocn, para usar a sintaxe conforme sua dica:

JasperPrint jsprint=JasperFillManager.fillReport(getClass().getResourceAsStream("relatorios/rel_completo.jasper"), parametros, jrs);

neste caso não é necessário adicionar as bibliotecas do ireport conforme havia feito anteriormente, correto?

Criado 10 de fevereiro de 2013
Ultima resposta 12 de fev. de 2013
Respostas 11
Participantes 3