Problema em achar o diretório da classe na execução do .jar

Pessoal, é o seguinte:
Me desculpem se este tópico for repetido, e acredito que seja. Mas lendo todos os anteriores e postando algumas vezes sobre isso, ainda assim, nao consegui resolver meu problema.

Em um certo método do JasperReports, tenho que passar o caminho de onde estão meus arquivos .jasper e .jrprint
E eles estão dentro do package Reports da minha aplicacao. Que nao tem package nenhum acima. Assim como os demais fontes. Para retorna o diretório em que estão as classes, eu faço o seguinte:

File pasta = null;
String pastaRel;

try {
    pasta = new File( Reports.Relatorio.class.getResource(".").toURI() );
    pastaRel = pasta.getAbsolutePath();
} catch (Exception ex) {
    JOptionPane.showMessageDialog(null, ex);
}

Que é o código que postei essa semana, mas nao consegui resolver o problema.

Faço isso, pois meus .jasper/.jrprint estão no mesmo package da classe Relatorio. Entao a uso como referencia. Ou seja, pasta recebe o diretorio em que está a classe Relatorio. (Assim como os relatorios que uso).

Quando rodo minha aplicação pelo NetBeans, tudo funciona perfeitamente. Mas quando rodo meu .jar e este método é executado, eu recebo um java.lang.NullPointerException. Esse erro ocorre na linha que atribui um new File pro ‘pasta’.
Já troquei . por / e tb recebi o mesmo erro
Tentei usar getPackage() mas aí recebo um FileNotFoundException

Quando rodo o projeto, este método consegue retornar o caminho que preciso para executar meus relatórios. Mas quando rodo meu .jar, é como se ele nao encontrasse o diretório da classe.

Tentei passar o caminho \Reports, Reports e tb recebo um FileNotFoundException.

Então, pq esse método nao funciona para o meu .jar?

Você não vai conseguir fazer isso dessa forma de dentro de um JAR, você simplesmente não vai conseguir pegar uma pasta dentro de um JAR, pois não dá pra formar uma URI com o caminho interno de um JAR.

Se os “resources” da sua aplicação estão dentro do JAR, você deve usar getResource() e getResourceAsStream() direto nos arquivos…

ex.:

Classe.class.getResourceAsStream("/pacote/relatorio.jasper");

Jair. Tentei isso que você me disse. Mas não consegui ainda.
Vou tentar ser um pouco mais específico agora.
Tenho duas classes envolvidas nisso. Uma em cada pacote
View\TelaPrincipal.java
Reports\Relatorio.java

Meus jasper/jrprint estao no pacote Reports. A minha ideia inicial, que funciona apenas rodando o projeto direto pela IDE era o seguinte. Na tela principal (que é de onde eu chamo o relatório) eu coloco em uma string o caminho do relatorio. Que era o codigo que pus no post. Depois, apenas concatenava o nome do relatorio a essa string. Ou seja rel1.jasper ou rel2.jasper.

O caminho fica em uma string pois o método JasperFillManager.fillReportToFile() exige isso.

Sendo assim, como eu faria para conseguir isso?
Veja que tentei na classe TelaPrincipal.java

Reports.Relatorio.class.getResourceAsStream("").toString();
Reports.Relatorio.class.getResourceAsStream("/rel1.jasper").toString();
Reports.Relatorio.class.getResourceAsStream("/Reports/rel1.jasper").toString();

e na Relatorio.java

getClass().getResourceAsStream(dirRel).toString();

Todos eles mal sucedidos. Tentei tb apenas o getResource(). Mas sem sucesso.

Talvez o que esteja me complicando também, é não sabe como tudo fica organizado dentro do .jar

E também não importa em qual classe eu obetenha esse caminho, desde que eu possa informar qual arquivo desses a classe Relatorio.java deve usar.

Como eu disse, você não vai conseguir pega o nome da pasta, nem o nome do arquivo desse jeito, você tem que usar o getResourceAsStream() jogando direto pra dentro do fillReport()…

O JasperFillManager tem alguns metodos que recebem um InputStream, o que o getResourceAsStream() retorna é exatamente um InputStream que você pode passar para o metodo fillReport!

Dê uma olhada nos metodos da classe JasperFillManager e escolha um metodo mais apropriado para o que você quer fazer:

http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JasperFillManager.html

ex.:

Map param = new HashMap(); JasperPrint print = JasperFillManager.fillReport(Classe.class.getResourceAsStream("/pacote/relatorio.jasper"), param);

Consegui! :grin:

O que estava atrapalhando era a corversão para String.

Agora está tudo em ordem…

Muito Obrigado!

Tem como vc postar o fonte de como fiko quando vc arrumou
kara to com esse problema
quase ficando louco
me ajuda por favor

me manda email

ou me add no msn

marlusdias@yahoo.com.br
o meu msn é esse email do yahoo mesmo
t++
abraços