iReport - Problema com caminho do jasperfile (RESOLVIDO)

23 respostas
D

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:

String arquivoJasper = "/educacional/reports/matriculadosMes.jasper";  
   
   URL jasperFile = getClass().getResource( arquivoJasper );

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?

23 Respostas

F

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/

D

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.

F

Testa trocando getResource() por getResourceAsStream().

D

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:

F

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

D

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”

J

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.

D

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

J

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

D

Tranquilo cara.

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

D

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:

F

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

D
furutani:
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:

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

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:

F

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

F

Eu consegui fazendo assim:

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

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
[img]http://www.furutani.com.br/tmp/jasper.jpg[/img]

D

Valew furutani, qualquer novidade me fale :wink:

D

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

Vou testar.

D

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:

F

Que bom q resolveu. :thumbup:

L

Opa, Estou com o mesmo problema e tentei a solução acima.

Mas fiquei com uma dúvida: qual o retorno da chamada da classe em

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

Pois eu coloquei um retorno de JRResultSetDataSource pois eu edito a SQL do Jasper e não está dando certo.

Valeu

L

to com o mesmo problema

null pointer exception

como se o caminho estivesse errado

java -jar ordem.jar

Exception in thread AWT-EventQueue-0 java.lang.NullPointerException

at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source)

at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)

at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Sour

ce)

at java.io.ObjectInputStream.readStreamHeader(Unknown Source)

at java.io.ObjectInputStream.(Unknown Source)

at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.

(ContextClassLoaderObjectInputStream.java:53)

at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:21

0)

at Tela.TelaPrincipal.Relatorio(TelaPrincipal.java:248)

at Tela.TelaPrincipal.jButton2ActionPerformed(TelaPrincipal.java:180)

at Tela.TelaPrincipal.access$100(TelaPrincipal.java:29)

at Tela.TelaPrincipal$2.actionPerformed(TelaPrincipal.java:85)

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

at javax.swing.plaf.basic.BasicButtonListener$Actions.actionPerformed(Un

known Source)

at javax.swing.SwingUtilities.notifyAction(Unknown Source)

at javax.swing.JComponent.processKeyBinding(Unknown Source)

at javax.swing.JComponent.processKeyBindings(Unknown Source)

at javax.swing.JComponent.processKeyEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)

at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Sour
ce)

at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Sour

ce)

at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEventImpl(Unknown Source)

at java.awt.EventQueue.access$000(Unknown Source)

at java.awt.EventQueue$3.run(Unknown Source)

at java.awt.EventQueue$3.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour

ce)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour

ce)

at java.awt.EventQueue$4.run(Unknown Source)

at java.awt.EventQueue$4.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour

ce)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)
L

os caminhos estao la e estao corretos

InputStream jasperFile = getClass().getResourceAsStream( “/Relatorios//relatorio.jasper” );

na dist tem o jar
e a pasta dos relatorios
/Relatorios//relatorio.jasper

L

resolvido…
o correto seria

/Relatorios/relatorio.jasper

com uma barra soh

Criado 26 de fevereiro de 2010
Ultima resposta 3 de mar. de 2012
Respostas 23
Participantes 5