Como o arquivo jar pode encontrar meu arquivo .jasper?

11 respostas
N

boa tarde
depois de gerado o .jar, o sistema não funciona, só funciona no eclipse…
tem a ver com manifest?
o meu está assim:

Manifest-Version: 1.0
Main-Class: MainPrincipal
Class-Path: lib/jasperreports-4.0.0.jar
relatorios/teste1.jasper

e o metodo que chama o relatório é esse:

public class ControlPrincipal 
{
	private Connection con;

	public void  gerarRelatorio()
	{			
		String path="relatorios/teste1.jasper";
		RelatorioDAO conecta = new RelatorioDAO();
		
		con = conecta.con;
		JasperPrint jasperPrint;
		try 
		{
			int resButtom = JOptionPane.showConfirmDialog(null, "Imprimindo...\nDeseja imprimir o relatório de teste?","Impressão relatório HRServiceClient",JOptionPane.YES_NO_OPTION);
			jasperPrint = JasperFillManager.fillReport(path,null,con);
			JasperPrintManager.printPage(jasperPrint, 0, true);
			if(resButtom == JOptionPane.YES_OPTION)
				JasperPrintManager.printPage(jasperPrint, 0, true);
		} catch (JRException e) 
		{
			e.printStackTrace();
		}
	}
}

a classe está em:
/HRServiceClient/src/br/com/hrtech/hrserviceclient/controller/ControlPrincipal.java
e o meu relatorio está em :
/HRServiceClient/relatorios/teste1.jasper

alguém pode me orientar nisso?
obrigado…

11 Respostas

pgioseffi

O Jasper tem que estar no teu WEB-INF e não no jar até onde eu sei.

N

mas estou trabalhando com desktop, como fica agora?
rs
obrigado…

pgioseffi

Em um diretório dentro da sua aplicação.

Cria, por exemplo, uma pasta irmã da pasta que gera seus .class chamada “relatorios”, por exemplo, e manda o teu sistema buscar de forma relativa essa pasta e aí é gol teu!

N

pgioseffi, desculpa minha ignorância, mas como sei onde fica minha pas de .class, no eclipse parace que não aparece
pelo eclipse estou chamando de forma relativa e dá certo, mas quando eu gero o jar, não dá certo
obrigado…

pgioseffi

Então irmão,

Vc não necessariamente precisa criar seu diretório onde eu falei, vc pode criar onde quiser e acessar essa pasta e, consequentemente, o .jasper dentro dele de forma relativa através da sua aplicação.

Mas dentro de um .jar, até onde eu sei não vai rolar mesmo!

N

na verdade meu problema é o jar, tem idéia de como eu poderia refenciar esse relatório?
obrigado pela ajuda…

pgioseffi

Como assim seu problema é o jar?

Cara, não pode referenciar o relatório pelo jar… Esse é um ponto, não adianta vc insistir nisso pq não dá certo…

O jeito é fazer o que eu falei, cria um novo diretório dentro da sua aplicação e referencia por lá. Sugiro não colocar cravado no código, mas que seu código leia um .properties onde ele tenha o caminho onde está seu relatório.

N

desculpa pgioseffi, eu não havia entendido…
deixa eu ver se eu entendi:
eu poderia criar um uma estrutura e colocar em um arquivo properties e depois busca nesse diretório certo?
fiz assim e deu certo, muito obrigado…
no meu raciocinio, eu teria que criar uma forma de criar essa estrutura, por exemplo c:\temp\relatórios\teste.jasper e copiar pra lá dinamicamente certo…
obrigado

pgioseffi

Se você postar teu código facilita de entender teu raciocínio. Até pq nem tudo que funciona é efetivamente certo no munco corporativo.

Eu tenho exemplos em casa de como eu poderia te ajudar a ler de um Properties que na minha opinião é o modo mais correto de ser feito.

N

então…
criei um arquivo propriedades.properties:

dirRelatorio=c:\\temp\\relatorios\\

carregando o properties:

public class Propriedades 
{
	private ResourceBundle config;
	
	public String coletarPropriedades(String propriedade)
	{
		config = ResourceBundle.getBundle("br/com/.../.../model/propriedades");
		return config.getString(propriedade);
	}
}

e meu método de impressão:

public class ControlPrincipal 
{
	private Connection con;
	private Propriedades config;

	public void gerarRelatorio() 
	{
		config = new Propriedades();
		String relatorio = "teste1.jasper";
		String path = config.coletarPropriedades("dirRelatorio").trim();

		RelatorioDAO conecta = new RelatorioDAO();

		con = conecta.con;
		JasperPrint jasperPrint;
		try 
		{
			int resButtom = JOptionPane.showConfirmDialog(null,"Imprimindo...\nDeseja imprimir o relatório de teste?","Impressão relatório ...",JOptionPane.YES_NO_OPTION);
			jasperPrint = JasperFillManager.fillReport(path.concat(relatorio),null, con);
			
			if (resButtom == JOptionPane.YES_OPTION) 
			{
				JasperPrintManager.printPage(jasperPrint, 0, true);
			}
		} catch (JRException e) {
			e.printStackTrace();
		}
	}
}

o próximo passo na minha cabeça, é garantir que a estrutura existe e depois colocar lá em tempo de execução o meu relatório…
ainda não sei como mas vou descobrir, rs

valeu obrigado…

N

acho que falei besteira, se não encontro o arquivo pra seja dentro do jar, como o encontraria para gravar dinamicamente…

Criado 11 de agosto de 2011
Ultima resposta 11 de ago. de 2011
Respostas 11
Participantes 2