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

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:

[code]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();
	}
}

}[/code]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!!

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

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

???