[Resolvido]Problema para chamar relatório pelo .jar da pasta dist

7 respostas
rodolpho.netto

Pessoal, quando eu executo o programa pelo netbeans ele chama meu relatório do ireport normal, perfeito!

porem quando uso o .jar da pasta dist, ele nao chama, até por que o caminho não é o mesmo e o relatório não está junto da pasta dist, como faço nesse caso? segue meu código que chama o relatório

HashMap parametros = new HashMap(); parametros.put("nome", ednome.getText()); parametros.put("data", newDate); parametros.put("data2", newDate2); JasperPrint jp = JasperFillManager.fillReport("src/yamada3/rel_tit.jasper", parametros, conexao.getYamadaConnection()); JasperViewer jv = new JasperViewer(jp, false); jv.setVisible(true);

7 Respostas

therodrigoagostin

tente usar assim!

rodolpho.netto:
Pessoal, quando eu executo o programa pelo netbeans ele chama meu relatório do ireport normal, perfeito!

porem quando uso o .jar da pasta dist, ele nao chama, até por que o caminho não é o mesmo e o relatório não está junto da pasta dist, como faço nesse caso? segue meu código que chama o relatório

HashMap parametros = new HashMap(); parametros.put("nome", ednome.getText()); parametros.put("data", newDate); parametros.put("data2", newDate2); JasperPrint jp = JasperFillManager.fillReport("./src/yamada3/rel_tit.jasper", parametros, conexao.getYamadaConnection()); JasperViewer jv = new JasperViewer(jp, false); jv.setVisible(true);

rodolpho.netto

Só consigo chamar o relatório no netbeans se usar o seguinte código

JasperPrint jp = JasperFillManager.fillReport("src/relatorio/rel_tit.jasper", parametros, conexao.getYamadaConnection());

Dai eu coloquei a pasta relatório dentro da pasta dist no programa, e ele não chama, clico ele nao faz nada, quando executado pelo arquivo .jar

erico_kl

Você deve empacotar o seu jasper junto com o jar e ler a partir dele…

O fillReport aceita um InputStream também, então:

InputStream is = getClass().getResourceAsStream("/relatorio/rel_tit.jasper"); JasperPrint jp = JasperFillManager.fillReport(is, parametros, conexao.getYamadaConnection());
Evite passar recursos que você irá disponibilizar para o cliente (tal como imagens, relatorios, sons…) como String direto, pois geralmente a API que você utilizar irá ler como caminho absoluto… as libs do Jasper são um exemplo…

Gleidson_Henrique

erico_kl:
Você deve empacotar o seu jasper junto com o jar e ler a partir dele…

O fillReport aceita um InputStream também, então:

InputStream is = getClass().getResourceAsStream("/relatorio/rel_tit.jasper"); JasperPrint jp = JasperFillManager.fillReport(is, parametros, conexao.getYamadaConnection());
Evite passar recursos que você irá disponibilizar para o cliente (tal como imagens, relatorios, sons…) como String direto, pois geralmente a API que você utilizar irá ler como caminho absoluto… as libs do Jasper são um exemplo…

Usar os relatórios dentro da jar nao acredito que seja uma boa ideia. Com os relatorios fora do jar, voce pode modificar e apenas atualizar um relatorio, sem ser necessário ficar gerando o jar toda hora.

Sobre a sua dúvida, faça como o amigo therodrigoagostin disse. Você apenas terá que ter duas pastas yamada3. Uma para o seu projeto do netbeans e outra para a pasta dist. Pois quando voce executa a partir do Netbeans, ele está pegando o caminho do Netbeans, e quando executa a pastir da dist, pega o caminho da dist.

Se quiser fazer o teste, cria um File file = new File("") e de um JOptionPane com o caminho do arquivo. Ele vai pegar o caminho do proprio arquivo, então você verá a diferença…

Abraços

rodolpho.netto

Resolvi com a solução do Amigo acima de compilar o jasper dentro do .jar

InputStream is = getClass().getResourceAsStream("/relatorio/rel_tit.jasper"); JasperPrint jp = JasperFillManager.fillReport(is, parametros, conexao.getYamadaConnection());

Obrigado!

erico_kl

E cada vez que você atualizar terá que ir em cada micro do cliente e atualizar o relatório? Não vejo viabilidade de fazer isso… então a melhor solução é colocar no jar… no momento que um relatório é atualizado, todos os clientes estarão (imaginando um cenário com WebStart, por exemplo)

Pense em um sistema com 30 clientes que acessam o sistema em um jar único disponibilizado em um servidor e distribuido via WebStart, como você faria se deixasse os jasper fora?

henc9

Também estou com esse erro e não consigo fazer funcionar… podem me ajudar meu codigo está assim!!!

co.conectar();
try {
co.executaSQL(“SELECT venda.id_venda AS Id_venda, venda.data_venda AS Data_venda,”+
" venda.id_Cliente AS Id_Cliente,"+
" venda.produto AS Produto,"+
" venda.parcelas AS Parcelas,"+
" venda.preco_individual AS Valor,"+
" clientes.nome AS Nome,"+
" venda.quantidade_produto AS Quantidade_produto FROM"+
" clientes clientes INNER JOIN venda venda ON clientes.id_cliente = venda.id_Cliente");
JRResultSetDataSource relatResul = new JRResultSetDataSource(co.rs);
JasperPrint jpPrint = JasperFillManager.fillReport(“dist/vendas.jasper”, new HashMap(), relatResul);
JasperViewer jv = new JasperViewer(jpPrint,false);
jv.setVisible(true);
jv.toFront();
co.Fechar_Conexao();
} catch (JRException ex) {
JOptionPane.showMessageDialog(rootPane,“Erro ao chamar Relatório!!”+ ex);
}

Como deve ficar???

Criado 11 de outubro de 2012
Ultima resposta 23 de set. de 2014
Respostas 7
Participantes 5