iReport - Problema com caminho do jasperfile (RESOLVIDO)

Postei em outro tópico, mas como não obtive resposta, irei criar este novo.

Estou criando os relatórios no iReport e quando executo pelo NetBeans funcionam perfeitamente, porém quando executo diretamente do JAR ele não encontra os arquivos jasper e gera um FileNotFoundException.

O caminho eu defini da seguinte forma:

[code] String arquivoJasper = “/educacional/reports/matriculadosMes.jasper”;

URL jasperFile = getClass().getResource( arquivoJasper ); [/code]

Fiz um “debug” e notei que ele retorna o jasperfile com o segiunte conteúdo quando executo pela JAR:

D:\Desenvolvimento\NetBeans\Gestao\dist\Gest_o_Educacional.jar!\educacional\reports\matriculadosMes.jasper

Abri o jar pelo WINRAR e o caminho \educacional\reports\matriculadosMes.jasper existe dentro dele.

Alguém pode me ajudar?

Olá

Veja se esse post meu não te ajuda http://www.furutani.com.br/2010/02/nullpointerexception-ou-filenotfoundexception-ao-executar-relatorios-com-jasper-reports/

Olá Futurami, tentei mas não consegui, não sei se é porque minha aplicação é desktop e estou usando URL ao inves de InputStream, veja como eu fiz:

O .jasper esta dentro do pacote reports, fiz a chamada utilizando o caminho do pacote “…/reports/relatorio.jasper”, no NetBeans roda normal, porém quando utilizo o JAR gerado, dispara o FileNotFoundException.

Testa trocando getResource() por getResourceAsStream().

Fiz as mudanças para utilizar getResourceAsStream() e continuo na mesma, no netbeans funciona, na hora de executar o jar não.

Tentei de várias formas, inclusive movi meu arquivo jasper para o pacote da minha classe GeraRelatorio e utilizei o …getResourceAsStream(“arquivo.jasper”)…e nem assim funcionou. :cry:

Conferiu se Os arquivos jasper estão dentro do jar ?

Conferi sim, abri o JAR pelo WINRAR, esta certinho, a estrutura é a seguinte:

JAR
-META-INF

-JAVA
–IO
–AWT
—EVENT

-EDUCACIONAL
–RESOURCES
–REPORTS
–EXCEPTIONS

Sendo que as classes java estão dentro da pasta “EDUCACIONAL” e os relatórios, tanto os .JASPER quanto os .JRXML estão dentro da pasta “REPORTS”

Isso aqui será que resolve?

// pega o app do projeto
ServletContext servletContext = (ServletContext)getContext().getExternalContext().getContext();
String path = servletContext.getRealPath("/relatorios/"+nomeRelatorio+".jrxml");

Eu costumo fazer assim e tem funcionado rs.

Minha aplicação é desktop, jcmaster. :expressionless:

Foi mal, não tinha prestado atenção. rs

Tranquilo cara.

Mais alguém??? Furutani??? :?:

Algumas considerações.

Utilizo o mesmo método para capturar a imagem de fundo da aplicação, e funciona normalmente, tanto no netbeans quanto no JAR.

getClass().getResource("/educacional/resources/fundo.png")

Tento fazer a mesma coisa com o arquivo .jasper e não funciona.

getClass().getResource("/educacional/reports/matriculadosMes.jasper")

Pensando ser algum problema com as pastas, movi o relatório para a pasta resource…e não funcionou…movi para a pasta educacional (raiz do projeto), e tb não funcionou.

Existe algum tipo de permissão que eu tenha que dar ao arquivo jasper para que o mesmo seja lido??

Coloquei um joptionpane para ver o retorno do getresource para a imagem e para o relatório e ambos tem a mesam estrutura, mudando apenas o nome do arquivo e a última pasta, no primeiro resources e no segundo reports.

Estou sem idéias… :cry:

Ta dificil. Agora só mexendo nos fontes para ter idéias mesmo do que pode ser. Por cima eu já chutei todas.

Juntei todos os métodos (criaconexão, gerarelatorio…etc) no método que é chamado no actionperforme da minha aplicação, no menu.

Eis a gambi:

[code]private void menuMatMesActionPerformed(java.awt.event.ActionEvent evt) {
EmpresaJpaController JPAUnidade = new EmpresaJpaController();
Empresa empresa = new Empresa();

    List lista = JPAUnidade.findEmpresaEntities();

    if (lista.size() != 0) {
        empresa = (Empresa) lista.get(0);

        String titulo = AplicacaoConstants.RelMatMes;

        String mesAno = FormataData.descMes(empresa.getMesEmp()).toUpperCase();
        mesAno += " - ";
        mesAno += empresa.getAnoEmp().toString();

        String mes = FormataData.numMes(empresa.getMesEmp());
        String ano = empresa.getAnoEmp().toString();

        String dataIni = ano + "-" + mes + "-01";
        String dataFim = ano + "-" + mes + "-31";

        Map parametros = new HashMap();
        parametros.put("ENTIDADE",empresa.getEntidEmp());
        parametros.put("MESANO",mesAno);
        parametros.put("DATAINI",dataIni);
        parametros.put("DATAFIM",dataFim);

        //URL jasperFile = this.getClass().getResource("/educacional/reports/matriculadosMes.jasper");
        InputStream jasperFile = getClass().getResourceAsStream("/educacional/reports/matriculadosMes.jasper");

        JasperPrint relatorio = null;
        
        String url = "jdbc:mysql://localhost:3306/EDUCACIONAL";
        String login = "root";
        String pwd = "educacao";
        JDialog dlgRelatorio = new JDialog(new javax.swing.JFrame(),titulo, true);
        dlgRelatorio.setSize(800,600);
        dlgRelatorio.setLocationRelativeTo(null);
        dlgRelatorio.setModal(true);

        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(GeraRelatorio.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null,FormataErro.FormataErro(ex.getMessage()),"Erro",0);
        }

        Connection con = null;

        try {
            con = DriverManager.getConnection(url, login, pwd);
        } catch (SQLException ex) {
            Logger.getLogger(GeraRelatorio.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null,FormataErro.FormataErro(ex.getMessage()),"Erro",0);
        }

        JasperReport jasperReport = null;

        if(jasperFile == null){
            JOptionPane.showMessageDialog(null,"Caminho do relatório não encontrado","Erro",0);
        }else{
            try {
                jasperReport = (JasperReport) JRLoader.loadObject( jasperFile );
            } catch (JRException ex) {
                Logger.getLogger(GeraRelatorio.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null,FormataErro.FormataErro(ex.getMessage()),"Erro",0);
            }

            try {
                relatorio = JasperFillManager.fillReport(jasperReport, parametros, con);
            }catch (JRException jRException) {
                JOptionPane.showMessageDialog(null,FormataErro.FormataErro(jRException.getMessage()),"Erro",0);
            }

            JasperViewer viewer = new JasperViewer(relatorio, false);
            viewer.setTitle(titulo);

            dlgRelatorio.getContentPane().add(viewer.getContentPane());
            dlgRelatorio.setVisible(true);


        }

/*
IORelatorio matMesX = null;
try {
matMesX = new IORelatorio(new java.net.URL(getClass().getResource("/educacional/reports/matriculadosMes.jasper"), “matriculadosMes.jasper”), parametros, titulo);
} catch (MalformedURLException ex) {
JOptionPane.showMessageDialog(null,FormataErro.FormataErro(ex.getMessage()),“Erro”,0);
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

        desktopPane.add(matMesX);
        matMesX.setVisible(true);*/
    }
}  [/code]

Detalhes:

  • Tentei tanto com GetResourceAsStream quanto com GetResource e nenhum funcionou.
  • Usei diversas formas de “definir” o caminho nos getResorces, tais como:

InputStream jasperFile = getClass().getResourceAsStream("/educacional/reports/matriculadosMes.jasper"); InputStream jasperFile = getClass().getResourceAsStream("educacional/reports/matriculadosMes.jasper"); InputStream jasperFile = getClass().getResourceAsStream("../educacional/reports/matriculadosMes.jasper");

e nenhum deles funcionou, sendo que no primeiro (que acredito ser o correto), nada é exibido, a aplicação simplesmente para e sequer exibe alguma exception, enquanto nos dois últimos é exibida a exception de arquivo não encontrado (jasperFile == null)

Relembrando que, executando pelo NetBeans, tanto com getResource quanto com GetResourceasStream, funciona! :cry:

Eu vou tentar fazer um teste aqui. Agora eu fiquei curioso

Eu consegui fazendo assim:

[code] public void visualizarRelatorio() {
JasperPrint relatorio = null;
JasperReport jasperReport = null;
Map parametros = new HashMap();
try {
InputStream jasperFile = Thread.currentThread().getClass().getResourceAsStream("/br/com/furutani/relatorios/Rel_Precipitacoes.jasper");
jasperReport = (JasperReport) JRLoader.loadObject( jasperFile );

        relatorio = JasperFillManager.fillReport(jasperReport, parametros, new RelatorioPrecipitacoesDS());

        JasperViewer viewer = new JasperViewer(relatorio, false);
        viewer.setTitle("Relatório");
        viewer.setVisible(true);

    } catch (JRException jRException) {
        jRException.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }[/code]

Ele executar normalmente fora do netbeans com o comando java -jar “C:\Users\Jundi\Documents\NetBeansProjects\ProjetoApp\dist\ProjetoApp.jar”

os arquivos estão organizados dessa forma

Valew furutani, qualquer novidade me fale :wink:

Putz…nem tinha visto que tinha respostas…foi mal.

Vou testar.

Furutani…MUITISSIMO OBRIGADO!!!

Não…o problema não era este…mas vc me deu uma luz…rs

Eu executei meu jar através do DOS (java -jar aplicacao.jar) …ai aconteceu o de sempre…sem exceptions…MAS…no DOS apareceu o erro…rs

Quando executei pelo netbeans foi normal…mas no jar, não sei porque diabos…pediu o pacote SPRING…estava dando uma classnotfound por causa desse pacote.

Inclui ele no meu projeto e funcionou!!!

Não sei porque ele foi solicitado…mas tudo bem…pelo menos funciona…rs

Obrigado novamente Furutani…um abraço. :thumbup:

Que bom q resolveu. :thumbup: