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

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

tente usar assim!

[quote=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);[/quote]

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

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…

[quote=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…[/quote]

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

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!

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?

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???