Localização de diretórios - De uma vez por TODAS

2 respostas
C

Bom dia galera!

Gostaria de criar este tópico para resolver de uma vez por todas o tratamento de diretórios que já vi em muitos tópicos pela internet com diversas discussões, mas sem nenhuma solução.
O grande problema é o seguinte:

Localizar o caminho para a pasta WebContent (root na aplicação java web) para ser utilizada pela classe File, ou seja:
String path = "caminho para o WebContent";
new File(path);
Até agora tudo ok. Se estivessemos em uma servlet, era só utilizar:
String path = getServletContext().getRealPath("/");
Porém, se estivessemos executando uma classe manualmente (como por exemplo, executar pelo eclipse: Run -> Java Application -> execução do metodo "main"), a maneira para chegar no WebContent seria:
String path = new File(".").getCanonicalPath();
O problema é que tenho uma classe utilitária que apenas retorna o caminho do root, e então, como não sei se o código que irá chamá-la será de um servlet, ou de um "Java Application", fiz o seguinte:
public class PathRootLocator{
	
	public String getRootPath(HttpServletRequest req) throws IOException{
		if(req!=null){
			// se o req não for nulo, sei que é um servlet
			return req.getServletContext().getRealPath("/");
		}else{
			// se o req for nulo, é execução de um "Java Application"
			return new File(".").getCanonicalPath();
		}
	}
	
}
Desta forma, a aplicação funciona corretamente, porém sei que não deve ser a melhor forma. Esta abordagem pode causar muitos problemas, como por exemplo, eu posso esquecer de passar o HttpServletRequest de dentro de um servlet, e então, receberia o path errado.

Para tentar solucionar este problema, resolvi criar este tópico para que possamos acabar com este problema de uma vez por todas!!!
Qual seria a forma de receber o caminho certo do root da aplicação (WebContent), independentemente da forma que estivesse executando esta função (de um Servelet ou de um "Java Application").

Agradeço antecipadamente a ajuda de todos!!

2 Respostas

gomesrod

Olá,

Uma das opções retorna o diretório onde estão as páginas de uma aplicação web, e a outra retorna o diretório de onde o programa foi iniciado. Não se trata de um parâmetro que informa como obter a informação, na verdade são informações totalmente diferentes, que serão usadas em situações diferentes!

Por esse motivo a existência de um método único já é algo que não tem sentido, e talvez seja isso que você instintivamente está achando que tem algo errado mas não consegue definir exatamente porque.

Aliás, você está ciente que o new File(".") não retorna o diretório da aplicação e sim o lugar de onde ela foi chamada?
(http://www.guj.com.br/java/206604-encontrar-diretorio-da-classe-em-tempo-de-execucao e http://www.guj.com.br/java/287332--resolvidocomo-sempre-achar-o-txt-indendente-do-pc-que-rode-a-aplicacao-)

C

gomesrod,

Na verdade eu não sabia. Agora entendi. O que aconteceu é que por coincidência, quando eu executo no Eclipse Run->Java Application, ele retorna o WebContent… mas na realidade, como você explicou, ele retorna este caminho porque realiza a execução deste diretório… mas pelo que percebi, isso não garante que sempre retornará esse caminho, pois depende do local de execução! Perfeito.

Então vamos lá para reformular a pergunta da maneira certa:

Quando estou num servlet é só fazer: String path = getServletContext().getRealPath("/");Porém, como retornar o caminho WebContent (root no java web) quando executar uma classe manualmente… pelo console por exemplo: java TesteDiretorioRoot

???

Criado 28 de dezembro de 2012
Ultima resposta 28 de dez. de 2012
Respostas 2
Participantes 2