[RESOLVIDO] Problema caminho do relatório .jasper

Bom dia pessoal, tenho algumas linhas de código para gerar um relatório a partir de um jButton, o problema é que se o meu caminho arquivo .jasper for relativo ele não funciona, assim :

    try {
        conex.conexao();
        conex.executaSql(sql);
        JRResultSetDataSource realResul = new JRResultSetDataSource(conex.rs);
        JasperPrint jpPrint = JasperFillManager.fillReport("relatorios/teste1.jasper", new HashMap(),realResul);
        JasperViewer jv = new JasperViewer(jpPrint);
        jv.setVisible(true);
        conex.desconecta();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "erro ao preencher relatorios\n\n" +e);
    }

porém se eu coloco um caminho absoluto “C:/Users/Meu Pc/Desktop/PB/src/relatorios/teste1.jasper” funciona normalmente. Alguém sabe o que pode estar ocorrendo ?

Use

getClass().getResourceAsStream("relatorios/test1.jasper");
1 curtida
        JasperPrint jpPrint = JasperFillManager.fillReport(getClass().getResourceAsStream("relatorios/teste1.jasper"), new HashMap(),realResul);

Retorna java.lang.NullPointerException.

Testa com o que o darlan disse e com o código abaixo acrescentando ‘/’ no início do caminho passado como parâmetro.
getClass().getResourceAsStream("/relatorios/test1.jasper");
ou
NomeDaClasse.class.getResourceAsStream("/relatorios/test1.jasper");

Dessa forma o user.dir vai encontrar onde .jar esta e dali em diante você poderia entrar em alguma pasta
caminho = System.getProperty(“user.dir”) + “”\\relatorios\\teste1.jasper";

@AntonioSantos e @darlan_machado obrigado pelas respostas, mas não funcionou em nenhuma possibilidade. Será que o fato de eu ter movido a pasta do projeto para a área de trabalho pode influenciar em algo?

sempre usa 2 > \\

System.getProperty("file.separator") resolve essa questão.

Tem certeza que o nome está correto do relatório?
E você consegue visualizar o arquivo do relatório pelo Package Explorer da IDE? Tenta dar um Refresh no projeto, selecionando e pressionando F5 ou clica com o direito e refresh, e tenta rodar novamente.

Olha só, posta o print com a estrutura de pastas do projeto que fica mais fácil.

diretorio
@darlan_machado

Testa o caminho como abaixo:
"../relatorios/test1.jasper"

[RESOLVIDO] Relatório Jasper só é exibido executando projeto pelo NetBeans Tenta esse tópico

Obrigado a todos pela ajuda. Consegui resolver alterando a linha do caminho para a seguinte :
JasperPrint jpPrint = JasperFillManager.fillReport(“src/relatorios/teste1.jasper”, new HashMap(),realResul);

Porém cheguei a um outro problema, como eu uso o java web start, após subir os arquivos atualizados para meu servidor ftp, o usuário que executa o launcher não consegue gerar os relatórios por causa do arquivos teste1.jasper (diz que não foi encontrado ), por que isso está ocorrendo ?

O link que enviei fala sobre isso.

Seu .jasper está dentro da pasta relatórios, então é só fazer:

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

Como já foi dito, quando você usa o getResourceAsStream, a String tem que começar com “/” para procurar a partir da raíz do classpath de sua aplicação.
Se o método retorna null, então o recurso não está no caminho correto ou não foi empacotado no JAR ou ZIP.

2 curtidas

Aqui funcionou, valeu!

conecta.conexao();
        try {
            conecta.executaSQL("SELECT * FROM tabela WHERE coluna ILIKE '%" + camponome.getText() + "%'");
            JRResultSetDataSource relatResul = new JRResultSetDataSource(conecta.rs);
            JasperPrint jpPrint = JasperFillManager.fillReport(getClass().getResourceAsStream("/relatorio/Arquivo.jasper"), new HashMap(), relatResul);
            JasperViewer jv = new JasperViewer(jpPrint, false);
            jv.setVisible(true);
            jv.toFront();
        } catch (JRException e) {
            JOptionPane.showMessageDialog(null, "Erro ao Selecionar os Dados!\nErro:" + e);
        }
        conecta.desconecta();
1 curtida

@staroski e @rodriguesabner obrigado pelas respostas, consegui resolver com a ajuda de vocês. :slight_smile:

1 curtida

Você testou antes de dizer que não dava certo??

@AntonioSantos sim testei, porém sem sucesso. Agora pela manhã apaguei o trecho de código e adaptei o modelo do @rodriguesabner de acordo com minha necessidade e funcionou perfeitamente. Achei um tanto estranho, visto que tentei essas 4 possibilidades ontem :

getClass().getResourceAsStream("/relatorios/test1.jasper");
NomeDaClasse.class.getResourceAsStream("/relatorios/test1.jasper");
getClass().getResourceAsStream(“relatorios/test1.jasper”);
NomeDaClasse.class.getResourceAsStream(“relatorios/test1.jasper”);

mas agradeço pela ajuda.

1 curtida