GetRealPath() ZICA

9 respostas
andrestrindade

Olá, estou tentando encontrar um arquivo .jasper no meu sistema web e está dando erros. O sistema não encontra.
Utilizei: String path = this.getServlet().getServletConfig().getServletContext().getRealPath("");
Depois concateno isso daí com o resto do endereço.
Está errado o endereço, pois depois do jboss\server\default.\web O “.” não deveria existir!!! Não sei porque tá ali, mas não tá funcionando pois não encontra o arquivo, graças ao maldito ponto! Sugestões?

Grato

9 Respostas

E

Use os métodos da classe File para fazer a concatenação.

import java.io.*;

class TiraPontos {
    public static void main (String[] args) throws IOException {
        String s = "C:\temp\.";
        File f = new File (s); 
        File g = new File (f, "teste.txt");// isto faz a concatenação...
        System.out.println (g.getCanonicalPath()); // se o diretório existir, irá mostrar 'c:\temp\teste.txt'
    }
}
andrestrindade

O problema é que não quero um diretório fixo, quero o diretório da aplicação. O getRealPath seria o ideal pra mim, mas não sei porque o danado insiste em botar um PONTO ali… E isso é antes de concatenar, o problema não é a concatenação.
Obrigado!

andrestrindade
entanglement:
Use os métodos da classe File para fazer a concatenação.
import java.io.*;

class TiraPontos {
    public static void main (String[] args) throws IOException {
        String s = "C:\temp\.";
        File f = new File (s); 
        File g = new File (f, "teste.txt");// isto faz a concatenação...
        System.out.println (g.getCanonicalPath()); // se o diretório existir, irá mostrar 'c:\temp\teste.txt'
    }
}

Do jeito que estou fazendo fica assim:
C:\Jboss\jboss-4.2.3.GA\server\default\.\tmp\deploy\aplicacao-exp.warweb\WEB-INF\reports\relatorio.jasper

O correto seria:
C:\Jboss\jboss-4.2.3.GA\server\default\tmp\deploy\aplicacao-exp.warweb\WEB-INF\reports\relatorio.jasper

Não consigo explicar com a razão, com meus conhecimentos, porque raios o ponto está ali. hehe
Grato

Priuli

Kara, eu costumo adicionar os relatorios em um pacote ou pasta chamada resources dentro da minha aplicação e obtenho o caminho do arquivo dinamicamente atraves do ClassLoader…

String path = this.getClass().getClassLoader().getResource("br/com/myapp/resources").getPath();
path = path.replace("/", File.separator);

vc pode colocar em qualquer pasta dentro do seu jar ou war e obter atraves deste comando…
Este comando funciona tanto no linux quanto no windows… pois to utilizando o File.separator.

Abrçs

andrestrindade

Priuli:
Kara, eu costumo adicionar os relatorios em um pacote ou pasta chamada resources dentro da minha aplicação e obtenho o caminho do arquivo dinamicamente atraves do ClassLoader…

String path = this.getClass().getClassLoader().getResource("br/com/myapp/resources").getPath();
path = path.replace("/", File.separator);

vc pode colocar em qualquer pasta dentro do seu jar ou war e obter atraves deste comando…
Este comando funciona tanto no linux quanto no windows… pois to utilizando o File.separator.

Abrçs

Não funcionou :l

gomesrod
Você tem que usar a primeira solução postada:
entanglement:
import java.io.*;

class TiraPontos {
    public static void main (String[] args) throws IOException {
        String s = "C:\temp\.";
        File f = new File (s); 
        File g = new File (f, "teste.txt");// isto faz a concatenação...
        System.out.println (g.getCanonicalPath()); // se o diretório existir, irá mostrar 'c:\temp\teste.txt'
    }
}
Mas evidentemente trocando o C:\\Temp pelo caminho obtido do getRealPath Está fixo apenas para simplificar o exemplo! O principal está aqui:
File f = new File(diretorio, nomeDoArquivo)
Essa linha é que junta o diretorio com nome do arquivo, criando um objeto File correspondente ao caminho completo.
andrestrindade
gomesrod:
Você tem que usar a primeira solução postada:
entanglement:
import java.io.*;

class TiraPontos {
    public static void main (String[] args) throws IOException {
        String s = "C:\temp\.";
        File f = new File (s); 
        File g = new File (f, "teste.txt");// isto faz a concatenação...
        System.out.println (g.getCanonicalPath()); // se o diretório existir, irá mostrar 'c:\temp\teste.txt'
    }
}
Mas evidentemente trocando o C:\\Temp pelo caminho obtido do getRealPath Está fixo apenas para simplificar o exemplo! O principal está aqui:
File f = new File(diretorio, nomeDoArquivo)
Essa linha é que junta o diretorio com nome do arquivo, criando um objeto File correspondente ao caminho completo.

Vou testar e posto a resposta. Obrigado Sr. Sirigueijo :>

Priuli

Me enganei eu uso este comando para obter os meus subrelatorios que passo como parametro dinamico, mais com este comando é possivel sim obter o caminho dos arquivos jasper. Este comando como disse é dinamico e funciona perfeitamente eu utilizo no sistema onde trabalho, tanto em linux como windows segue o codigo que utilizo:

package br.com.myapp;

public class ...{

	@SuppressWarnings("unchecked")
	public File gerarRelatorioDocumento(Filtro filtro, HashMap <String, Object> parameters) throws CoreException{
                                String relatorioPath =  "relatorios/meuRelatorio.jasper";		
                                // os arquivos .jasper estão no pacote br.com.myapp.relatorios e está classe está uma pasta antes da pasta de relatorio

		parameters.put("veiculoList", new JRBeanCollectionDataSource((List)parameters.get("veiculoList")));
		
		String path = this.getJasperPath();

		parameters.put("SUBREPORT_DIR", path);
		parameters.put("SUBREPORT_DIR_IMG",  path);
	
		return prepareReportXLS(filtro,(ResultSet)parameters.get("rs"), relatorioPath);
	}

                private File prepareReportXLS(FiltroHashMap filtro, ResultSet rs, String relatorioPath) throws CoreException{
		File file = null;
		try {
			JRResultSetDataSource ds = new JRResultSetDataSource(rs);			
			
			//Recupera o arquivo jasper, verificando sua existencia
			InputStream reportStream = this.getClass().getResourceAsStream(relatorioPath);
			
			//Objetos necessarios para o JasperReport
			JRXlsExporter exportaXLS = new JRXlsExporter();
			file = File.createTempFile("temp", "relatorioLocalJur");
			
			//Gera report
			JasperPrint jasperPrint = JasperFillManager.fillReport(reportStream, filtro.getMap(), ds);
			exportaXLS.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
			exportaXLS.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);   
			exportaXLS.setParameter(JRExporterParameter.OUTPUT_FILE, file);
			exportaXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);    
			
			exportaXLS.exportReport();
		} catch (Exception e) {
			throw new MyException("Ocorreu um erro ao gerar o relatório. Erro="+e.getMessage(),e);			
		}				
		return file;
	}	

}
darkan666

tenta isso:

FacesContext facesContext = FacesContext.getCurrentInstance();  
    ServletContext sContext = (ServletContext) facesContext.getExternalContext().getContext();  
    String seuDiretorio = sContext.getRealPath("/nomeDaPasta");

:smiley:

Criado 3 de novembro de 2010
Ultima resposta 10 de ago. de 2012
Respostas 9
Participantes 5