Relatório Jasper não abre quando gero o arquivo.jar

Quando executo na IDE o relatório é gerado normalmente. O problema é quando gero o jar da aplicação. Ao gerar o jar, ele não consegue gerar o relatório.

Método do relatório

  public void btnRelatorio() {
        try {

            if (this.view.getTblVendas().getSelectedRow() != - 1) {
                int id = Integer.parseInt(String.valueOf(this.view.getTblVendas().getValueAt(this.view.getTblVendas().getSelectedRow(), 0)));
                HashMap<String, Object> dados = new HashMap();
                dados.put("id", id);
                
                JasperReport relatorioCompilado = JasperCompileManager.compileReport("src/br/com/clinica/model/modelorelatorio/Pagamento.jrxml");
                JasperPrint relatorioPrenchido = JasperFillManager.fillReport(relatorioCompilado, dados, new ConnectionFactory().getConnection());

                JFrame tela = new JFrame();
                tela.setSize(1000, 500);

                JRViewer view = new JRViewer(relatorioPrenchido);

                tela.getContentPane().add(view);
                tela.setVisible(true);
            } else {
                JOptionPane.showMessageDialog(null, "Escolha uma linha da tabela");
            }
        } catch (JRException ex) {
            Logger.getLogger(TelaConsulta.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

Caminho do relatório

Sem%20t%C3%ADtulo

Essa linha está errada:

JasperReport relatorioCompilado = JasperCompileManager.compileReport("src/br/com/clinica/model/modelorelatorio/Pagamento.jrxml");

Vc não pode referenciar arquivos no projeto dessa forma. Vc deve recuperar o arquivo do classpath assim:

InputStream relatorio = getClass().getResourceAsStream("/br/com/clinica/model/modelorelatorio/Pagamento.jrxml");

Isso é por causa do classpath. Qualquer arquivo que estiver no classpath estará disponível em tempo de execução. Isso garante que vc não terá problemas com caminhos relativos, independentemente de onde o jar da sua aplicação esteja.

1 curtida

Muito obrigado! Resolveu o problema.

Outra coisa se vc puder ajudar amigo. Estou tendo o mesmo problema ao enviar um e-mail via java. Ao gerar o .jar, ele não consegue enviar o e-mail.

 public void enviarEmail() {
        String senha = String.valueOf(this.view.getTfSenha().getPassword());

        SimpleEmail email = new SimpleEmail();
        email.setHostName("smtp.gmail.com");
        email.setSmtpPort(465);
        email.setAuthenticator(new DefaultAuthenticator(this.view.getTfEmail().getText(), senha));
        email.setSSLOnConnect(true);

        try {
            email.setFrom(this.view.getTfEmail().getText());
            email.setSubject(this.view.getTfAssunto().getText());
            email.setMsg(this.view.getTfTexto().getText());
            email.addTo("teste@gmail.com");
            email.send();

            JOptionPane.showMessageDialog(null, "E-mail enviado com sucesso!");
        } catch (Exception e) {

            e.printStackTrace();
        }

    }

Execute o jar pela linha de comando e tente enviar o email. Se estiver estourando alguma exceção, deve aparecer no terminal. Pegue o erro e poste aqui (de preferência, crie um novo tópico, para que ele tenha mais destaque).

De qualquer forma, fazer isso:

não é uma boa prática, pq vc esconde o erro do usuário. O ideal seria apresentar algo na tela em caso de erro, como um JOptionpane ou jogar o erro num arquivo de log na mesma pasta do jar, por exemplo.