RESOLVIDO: JAR e localização do Jasper File

Salve Pessoal,

Estou com um problema em uma aplicação Swing onde uso o Jasper para a geração dos relatórios PDF. No NetBeans tudo funciona perfeitamente, mas quando gero o Jar e tento executá-lo, a aplicação não encontra o arquivo jasper para a geração do relatório. Alguém já enfrentou este problema? O diretório com os arquivos do jasper está na raiz dos pacotes da aplicação. Alguma sugestão?

Obrigado,

celso

Voce empacotou os arquivos do jasper (.jasper) junto com o seu JAR?

Pelo menos se voce tem um projeto com os arquivos jasper dentro dele voce pode chamar por caminho relativo. Exemplo;

Projeto
  src
    br.com.portaljava.relatorios (todos os seus arquivos jasper)

chamando um arquivo
String pagina = "./src/br/com/portaljava/relatorios/nome_da_pagina.jasper"

//.... executa pelo viewer

Olá Carlos,

Obrigado pela ajuda. O erro continua. Ao executar o Jar eu obtenho:

<code>
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: \br\com
santacasa\relatorios\FichaAtendimento.jasper
</code>

Tentei como vc disse .\src\br\com
santacasa\relatorios\FichaAtendimento.jasper e diversas combinações mas não dá certo.

Abri o Jar e o jasper está empacotado no diretório listado…

O código exato que estou usando é:

<code>
String relatorio = “/br/com/santacasa/relatorios/FichaAtendimento”;
try {
// Janela pata visualização do PDF
JDialog viewer = new JDialog(new javax.swing.JFrame(),
“Visualização do Relatório”, true);
viewer.setSize(800,600);
viewer.setLocationRelativeTo(null);

      JasperReport relatoriosJasper = (JasperReport) JRLoader.
         loadObject(relatorio + ".jasper");
      
      JasperPrint jasperPrint = JasperFillManager.
         fillReport(relatoriosJasper, parameters,  new JREmptyDataSource());
      JasperViewer jrViewer = new JasperViewer(jasperPrint, true);
      viewer.getContentPane().add(jrViewer.getContentPane());
      viewer.setVisible(true);
   } catch (JRException jre) {
      jre.printStackTrace();
   } catch (Exception ex) {
      ex.getMessage();
   }

</code>

Alguma outra idéia?

Obrigado,

celso[quote][/quote]

Olá Carlos,

Obrigado pela ajuda. O erro continua. Ao executar o Jar eu obtenho:

<code>
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: \br\com
santacasa\relatorios\FichaAtendimento.jasper
</code>

Tentei como vc disse .\src\br\com
santacasa\relatorios\FichaAtendimento.jasper e diversas combinações mas não dá certo.

Abri o Jar e o jasper está empacotado no diretório listado…

O código exato que estou usando é:

<code>
String relatorio = “/br/com/santacasa/relatorios/FichaAtendimento”;
try {
// Janela pata visualização do PDF
JDialog viewer = new JDialog(new javax.swing.JFrame(),
“Visualização do Relatório”, true);
viewer.setSize(800,600);
viewer.setLocationRelativeTo(null);

      JasperReport relatoriosJasper = (JasperReport) JRLoader.
         loadObject(relatorio + ".jasper");
      
      JasperPrint jasperPrint = JasperFillManager.
         fillReport(relatoriosJasper, parameters,  new JREmptyDataSource());
      JasperViewer jrViewer = new JasperViewer(jasperPrint, true);
      viewer.getContentPane().add(jrViewer.getContentPane());
      viewer.setVisible(true);
   } catch (JRException jre) {
      jre.printStackTrace();
   } catch (Exception ex) {
      ex.getMessage();
   }

</code>

Alguma outra idéia?

Obrigado,

celso[quote][/quote]

Olá Carlos,

Obrigado pela ajuda. O erro continua. Ao executar o Jar eu obtenho:

net.sf.jasperreports.engine.JRException&#58; java.io.FileNotFoundException&#58; \br\com\
santacasa\relatorios\FichaAtendimento.jasper

Tentei como vc disse .\src\br\com
santacasa\relatorios\FichaAtendimento.jasper e diversas combinações mas não dá certo.

Abri o Jar e o jasper está empacotado no diretório listado…

O código exato que estou usando é:

       String relatorio = &quot;/br/com/santacasa/relatorios/FichaAtendimento&quot;;
       try &#123;
          // Janela pata visualização do PDF
          JDialog viewer = new JDialog&#40;new javax.swing.JFrame&#40;&#41;,
             &quot;Visualização do Relatório&quot;, true&#41;;
          viewer.setSize&#40;800,600&#41;;
          viewer.setLocationRelativeTo&#40;null&#41;;
          
          JasperReport relatoriosJasper = &#40;JasperReport&#41; JRLoader.
             loadObject&#40;relatorio + &quot;.jasper&quot;&#41;;
          
          JasperPrint jasperPrint = JasperFillManager.
             fillReport&#40;relatoriosJasper, parameters,  new JREmptyDataSource&#40;&#41;&#41;;
          JasperViewer jrViewer = new JasperViewer&#40;jasperPrint, true&#41;;
          viewer.getContentPane&#40;&#41;.add&#40;jrViewer.getContentPane&#40;&#41;&#41;;
          viewer.setVisible&#40;true&#41;;
       &#125; catch &#40;JRException jre&#41; &#123;
          jre.printStackTrace&#40;&#41;;
       &#125; catch &#40;Exception ex&#41; &#123;
          ex.getMessage&#40;&#41;;
       &#125;

Alguma outra idéia?

Obrigado,

celso

[quote=“jcfreire”]Olá Carlos,

Obrigado pela ajuda. O erro continua. Ao executar o Jar eu obtenho:

net.sf.jasperreports.engine.JRException&#58; java.io.FileNotFoundException&#58; \br\com\
santacasa\relatorios\FichaAtendimento.jasper

Tentei como vc disse .\src\br\com
santacasa\relatorios\FichaAtendimento.jasper e diversas combinações mas não dá certo.

Abri o Jar e o jasper está empacotado no diretório listado…

O código exato que estou usando é:

       String relatorio = &quot;/br/com/santacasa/relatorios/FichaAtendimento&quot;;
       try &#123;
          // Janela pata visualização do PDF
          JDialog viewer = new JDialog&#40;new javax.swing.JFrame&#40;&#41;,
             &quot;Visualização do Relatório&quot;, true&#41;;
          viewer.setSize&#40;800,600&#41;;
          viewer.setLocationRelativeTo&#40;null&#41;;
          
          JasperReport relatoriosJasper = &#40;JasperReport&#41; JRLoader.
             loadObject&#40;relatorio + &quot;.jasper&quot;&#41;;
          
          JasperPrint jasperPrint = JasperFillManager.
             fillReport&#40;relatoriosJasper, parameters,  new JREmptyDataSource&#40;&#41;&#41;;
          JasperViewer jrViewer = new JasperViewer&#40;jasperPrint, true&#41;;
          viewer.getContentPane&#40;&#41;.add&#40;jrViewer.getContentPane&#40;&#41;&#41;;
          viewer.setVisible&#40;true&#41;;
       &#125; catch &#40;JRException jre&#41; &#123;
          jre.printStackTrace&#40;&#41;;
       &#125; catch &#40;Exception ex&#41; &#123;
          ex.getMessage&#40;&#41;;
       &#125;

Alguma outra idéia?

Obrigado,

celso[/quote]

Olá!

Algum amigo uma vez passou por um problema parecido… resolvemos passando um classloader diferente em algum ponto…

mas o classloader que utilizamos foi o

Thread.currentThread().getContextClassLoader()

acho que utilizamos o classloader para dar um load no stream do arquivo do jasper… e passava o stream para o engine do jasper…

da uma olhada ae…

abraços

[quote=“jcfreire”]Olá Carlos,

Obrigado pela ajuda. O erro continua. Ao executar o Jar eu obtenho:

net.sf.jasperreports.engine.JRException&#58; java.io.FileNotFoundException&#58; \br\com\
santacasa\relatorios\FichaAtendimento.jasper

Tentei como vc disse .\src\br\com
santacasa\relatorios\FichaAtendimento.jasper e diversas combinações mas não dá certo.

Abri o Jar e o jasper está empacotado no diretório listado…

O código exato que estou usando é:

       String relatorio = &quot;/br/com/santacasa/relatorios/FichaAtendimento&quot;;
       try &#123;
          // Janela pata visualização do PDF
          JDialog viewer = new JDialog&#40;new javax.swing.JFrame&#40;&#41;,
             &quot;Visualização do Relatório&quot;, true&#41;;
          viewer.setSize&#40;800,600&#41;;
          viewer.setLocationRelativeTo&#40;null&#41;;
          
          JasperReport relatoriosJasper = &#40;JasperReport&#41; JRLoader.
             loadObject&#40;relatorio + &quot;.jasper&quot;&#41;;
          
          JasperPrint jasperPrint = JasperFillManager.
             fillReport&#40;relatoriosJasper, parameters,  new JREmptyDataSource&#40;&#41;&#41;;
          JasperViewer jrViewer = new JasperViewer&#40;jasperPrint, true&#41;;
          viewer.getContentPane&#40;&#41;.add&#40;jrViewer.getContentPane&#40;&#41;&#41;;
          viewer.setVisible&#40;true&#41;;
       &#125; catch &#40;JRException jre&#41; &#123;
          jre.printStackTrace&#40;&#41;;
       &#125; catch &#40;Exception ex&#41; &#123;
          ex.getMessage&#40;&#41;;
       &#125;

Alguma outra idéia?

Obrigado,

celso[/quote]

Olá!

Algum amigo uma vez passou por um problema parecido… resolvemos passando um classloader diferente em algum ponto…

mas o classloader que utilizamos foi o

Thread.currentThread().getContextClassLoader()

acho que utilizamos o classloader para dar um load no stream do arquivo do jasper… e passava o stream para o engine do jasper…

da uma olhada ae…

abraços

Ola Dennys, veja a configuração dos caminhos do seu projeto, as vezes voce tem que ficar tentando um monte de vezes até descobrir a causa real do seu problema, mas empacotei uma aplicação de teste aqui num arquivo JAR e funcionou corretamente.

String relatorio = &quot;./src/br/com/santacasa/relatorios/FichaAtendimento.jasper&quot;;
// ou FichaAtendimento é um diretorio ou arquivo jasper?

Olá Carlos,

Obrigado pela ajuda. O erro continua. Ao executar o Jar eu obtenho:

net.sf.jasperreports.engine.JRException&#58; java.io.FileNotFoundException&#58; \br\com\
santacasa\relatorios\FichaAtendimento.jasper

Tentei como vc disse .\src\br\com
santacasa\relatorios\FichaAtendimento.jasper e diversas combinações mas não dá certo.

Abri o Jar e o jasper está empacotado no diretório listado…

O código exato que estou usando é:

       String relatorio = &quot;/br/com/santacasa/relatorios/FichaAtendimento&quot;;
       try &#123;
          // Janela pata visualização do PDF
          JDialog viewer = new JDialog&#40;new javax.swing.JFrame&#40;&#41;,
             &quot;Visualização do Relatório&quot;, true&#41;;
          viewer.setSize&#40;800,600&#41;;
          viewer.setLocationRelativeTo&#40;null&#41;;
          
          JasperReport relatoriosJasper = &#40;JasperReport&#41; JRLoader.
             loadObject&#40;relatorio + &quot;.jasper&quot;&#41;;
          
          JasperPrint jasperPrint = JasperFillManager.
             fillReport&#40;relatoriosJasper, parameters,  new JREmptyDataSource&#40;&#41;&#41;;
          JasperViewer jrViewer = new JasperViewer&#40;jasperPrint, true&#41;;
          viewer.getContentPane&#40;&#41;.add&#40;jrViewer.getContentPane&#40;&#41;&#41;;
          viewer.setVisible&#40;true&#41;;
       &#125; catch &#40;JRException jre&#41; &#123;
          jre.printStackTrace&#40;&#41;;
       &#125; catch &#40;Exception ex&#41; &#123;
          ex.getMessage&#40;&#41;;
       &#125;

Alguma outra idéia?

Obrigado,

celso

[/code]
String relatorio = “./src/br/com/santacasa/relatorios/FichaAtendimento.jasper”;
try {
// Janela pata visualização do PDF
JDialog viewer = new JDialog(new javax.swing.JFrame(),
“Visualização do Relatório”, true);
viewer.setSize(800,600);
viewer.setLocationRelativeTo(null);

      JasperReport relatoriosJasper = (JasperReport) JRLoader. 
         loadObject(relatorio); 
      
      JasperPrint jasperPrint = JasperFillManager. 
         fillReport(relatoriosJasper, parameters,  new JREmptyDataSource()); 
      JasperViewer jrViewer = new JasperViewer(jasperPrint, true); 
      viewer.getContentPane().add(jrViewer.getContentPane()); 
      viewer.setVisible(true); 
   } catch (JRException jre) { 
      jre.printStackTrace(); 
   } catch (Exception ex) { 
      ex.getMessage(); 
   }

[code]

Teria que funcionar.[/code]

Olhando a API lembrei como foi feito… olha ae…


String relatorio = &quot;/br/com/santacasa/relatorios/FichaAtendimento&quot;;

ClasLoader classLoader = Thread.currentThread&#40;&#41;.getContextClassLoader&#40;'&#41;;

InputStream isJasper = classLoader.getResourceAsStream&#40;relatorio + &quot;.jasper&quot;&#41;;

JasperReport relatoriosJasper = &#40;JasperReport&#41; JRLoader.loadObject&#40; isJasper &#41;;

[quote=“carlosjrcabelo”]Ola Dennys, veja a configuração dos caminhos do seu projeto, as vezes voce tem que ficar tentando um monte de vezes até descobrir a causa real do seu problema, mas empacotei uma aplicação de teste aqui num arquivo JAR e funcionou corretamente.

[code]
String relatorio = "./src/br/com/santacasa/relatorios/FichaAtendimento.jasper";
// ou FichaAtendimento é um diretorio ou arquivo jasper?

[/code][/quote]

FichaAtendimento.jasper é o nome do arquivo jasper. Já tentei diferentes possibilidades e nada. Qdo o NetBeans gera o jar o existe o diretório \br\com\santacasa\relatorios com o arquivo FichaAtendimento.jasper dentro dele, mas quando eu tento executar dá o erro que eu transcrevi…

O MANIFEST do jar é:

Manifest-Version&#58; 1.0
Ant-Version&#58; Apache Ant 1.6.5
Created-By&#58; 1.6.0_03-b05 &#40;Sun Microsystems Inc.&#41;
Main-Class&#58; br.com.santacasa.janelas.AtendimentoPS
Class-Path&#58; lib/substance.jar lib/toplink-essentials.jar lib/toplink-e
 ssentials-agent.jar lib/commons-logging-1.1.jar lib/jasperreports-1.3
 .4.jar lib/commons-collections-3.2.jar lib/itext-1.3.1.jar lib/postgr
 esql-8.1-405.jdbc3.jar
X-COMMENT&#58; Main-Class will be added automatically by build

Alguma idéia?

celso

PS: perdão pelos múltiplos posts semelhantes, mas no meu navegador estava travando e não aparecia que estava enviando, ai cliquei diversas vezes…

Olá Pessoal,

Tentei diversas combinações de diretório e embora algumas funcionem no Netbeans quando eu gero o jar e o executo tenho o erro novamente. Seguindo a sugestão do Dennys, alterei o código para:

       String relatorio = &quot;./br/com/santacasa/relatorios/FichaAtendimento.jasper&quot;; 
       //String relatorio = &quot;/relatorios/FichaAtendimento.jasper&quot;;
       try &#123;
          // Janela pata visualização do PDF
          JDialog viewer = new JDialog&#40;new javax.swing.JFrame&#40;&#41;,
             &quot;Visualização do Relatório&quot;, true&#41;;
          viewer.setSize&#40;800,600&#41;;
          viewer.setLocationRelativeTo&#40;null&#41;;
          
         ClassLoader classLoader = Thread.currentThread&#40;&#41;.getContextClassLoader&#40;&#41;; 
         InputStream isJasper = classLoader.getResourceAsStream&#40;relatorio&#41;; 
         JasperReport relatoriosJasper = &#40;JasperReport&#41; JRLoader.loadObject&#40; isJasper &#41;;
          
          JasperPrint jasperPrint = JasperFillManager.
             fillReport&#40;relatoriosJasper, parameters,  new JREmptyDataSource&#40;&#41;&#41;;
          JasperViewer jrViewer = new JasperViewer&#40;jasperPrint, true&#41;;
          viewer.getContentPane&#40;&#41;.add&#40;jrViewer.getContentPane&#40;&#41;&#41;;
          viewer.setVisible&#40;true&#41;;
       &#125; catch &#40;JRException jre&#41; &#123;
          jre.printStackTrace&#40;&#41;;
       &#125; catch &#40;Exception ex&#41; &#123;
          ex.getMessage&#40;&#41;;
       &#125;

Novamente dentro do NetBeans funciona perfeitamente, mas quando eu executo o Jar, quando ele tenta criar o InputStream tenho o erro: Ljava.lang.StackTraceElement;@13e846f.

Já postei uma mensagem no Forum do JasperReport mas até agora não recebi nenhuma resposta…

Obrigado pela ajuda,

celso

[quote=“jcfreire”]Olá Pessoal,

Tentei diversas combinações de diretório e embora algumas funcionem no Netbeans quando eu gero o jar e o executo tenho o erro novamente. Seguindo a sugestão do Dennys, alterei o código para:

       String relatorio = &quot;./br/com/santacasa/relatorios/FichaAtendimento.jasper&quot;; 
       //String relatorio = &quot;/relatorios/FichaAtendimento.jasper&quot;;
       try &#123;
          // Janela pata visualização do PDF
          JDialog viewer = new JDialog&#40;new javax.swing.JFrame&#40;&#41;,
             &quot;Visualização do Relatório&quot;, true&#41;;
          viewer.setSize&#40;800,600&#41;;
          viewer.setLocationRelativeTo&#40;null&#41;;
          
         ClassLoader classLoader = Thread.currentThread&#40;&#41;.getContextClassLoader&#40;&#41;; 
         InputStream isJasper = classLoader.getResourceAsStream&#40;relatorio&#41;; 
         JasperReport relatoriosJasper = &#40;JasperReport&#41; JRLoader.loadObject&#40; isJasper &#41;;
          
          JasperPrint jasperPrint = JasperFillManager.
             fillReport&#40;relatoriosJasper, parameters,  new JREmptyDataSource&#40;&#41;&#41;;
          JasperViewer jrViewer = new JasperViewer&#40;jasperPrint, true&#41;;
          viewer.getContentPane&#40;&#41;.add&#40;jrViewer.getContentPane&#40;&#41;&#41;;
          viewer.setVisible&#40;true&#41;;
       &#125; catch &#40;JRException jre&#41; &#123;
          jre.printStackTrace&#40;&#41;;
       &#125; catch &#40;Exception ex&#41; &#123;
          ex.getMessage&#40;&#41;;
       &#125;

Novamente dentro do NetBeans funciona perfeitamente, mas quando eu executo o Jar, quando ele tenta criar o InputStream tenho o erro: Ljava.lang.StackTraceElement;@13e846f.

Já postei uma mensagem no Forum do JasperReport mas até agora não recebi nenhuma resposta…

Obrigado pela ajuda,

celso[/quote]

Olá…

Coloca a exception completa para facilitar a compreensão do erro.

Abraços!

Achei a solução olhando em http://forum.java.sun.com/thread.jspa?threadID=572955&start=0 e tentando um monte de coisa…

Pra funcionar ficou assim:

       String relatorio = &quot;/br/com/santacasa/relatorios/FichaAtendimento.jasper&quot;;
       try &#123;
          // Janela pata visualização do PDF
          JDialog viewer = new JDialog&#40;new javax.swing.JFrame&#40;&#41;,
             &quot;Visualização do Relatório&quot;, true&#41;;
          viewer.setSize&#40;800,600&#41;;
          viewer.setLocationRelativeTo&#40;null&#41;;
          
          // AtendimentoPS é o nome da classe.
          InputStream isJasper = AtendimentoPS.class.getResourceAsStream&#40;relatorio&#41;;
          JasperReport relatoriosJasper = &#40;JasperReport&#41; JRLoader.loadObject&#40; isJasper &#41;;
          
          JasperPrint jasperPrint = JasperFillManager.
             fillReport&#40;relatoriosJasper, parameters,  new JREmptyDataSource&#40;&#41;&#41;;
          JasperViewer jrViewer = new JasperViewer&#40;jasperPrint, true&#41;;
          viewer.getContentPane&#40;&#41;.add&#40;jrViewer.getContentPane&#40;&#41;&#41;;
          viewer.setVisible&#40;true&#41;;
       &#125; catch &#40;JRException jre&#41; &#123;
          log.error&#40;jre.getMessage&#40;&#41;&#41;;
       &#125; catch &#40;Exception ex&#41; &#123;
          log.error&#40;ex.getMessage&#40;&#41;&#41;;
       &#125;

Obrigado pela ajuda, mas porque será que com a solução do Dennys não funcionou?

celso

[quote=“jcfreire”]Achei a solução olhando em http://forum.java.sun.com/thread.jspa?threadID=572955&start=0 e tentando um monte de coisa…

Pra funcionar ficou assim:

       String relatorio = &quot;/br/com/santacasa/relatorios/FichaAtendimento.jasper&quot;;
       try &#123;
          log.info&#40;&quot;Entrou no try&quot;&#41;;
          // Janela pata visualização do PDF
          JDialog viewer = new JDialog&#40;new javax.swing.JFrame&#40;&#41;,
             &quot;Visualização do Relatório&quot;, true&#41;;
          viewer.setSize&#40;800,600&#41;;
          viewer.setLocationRelativeTo&#40;null&#41;;
          
          // AtendimentoPS é o nome da classe.
          InputStream isJasper = AtendimentoPS.class.getResourceAsStream&#40;relatorio&#41;;
          JasperReport relatoriosJasper = &#40;JasperReport&#41; JRLoader.loadObject&#40; isJasper &#41;;
          
          JasperPrint jasperPrint = JasperFillManager.
             fillReport&#40;relatoriosJasper, parameters,  new JREmptyDataSource&#40;&#41;&#41;;
          JasperViewer jrViewer = new JasperViewer&#40;jasperPrint, true&#41;;
          viewer.getContentPane&#40;&#41;.add&#40;jrViewer.getContentPane&#40;&#41;&#41;;
          viewer.setVisible&#40;true&#41;;
       &#125; catch &#40;JRException jre&#41; &#123;
          log.error&#40;jre.getMessage&#40;&#41;&#41;;
       &#125; catch &#40;Exception ex&#41; &#123;
          log.error&#40;ex.getMessage&#40;&#41;&#41;;
       &#125;

Obrigado pela ajuda, mas porque será que com a solução do Dennys não funcionou?

celso[/quote]

Lembrei… tive que pegar o classloader de uma forma diferente pois estavamos utilizando Spring e dava problema ClassLoader… na hierarquia dos ClassLoader’s…

Sem Spring basta acessar o classloader da forma que você usou…

Abraços!