Mas isso não é o path da aplicação, é o path onde você está.
Algumas pessoas costumam confundir essas duas coisas, mas se pode fazer uma experiência simples para ver a diferença:
- Criar um arquivo Caminho.java, contendo a seguinte classe:
import java.io.File;
class Caminho {
public static void main(String[] args) throws java.io.IOException {
System.out.println("Path: " + new File("").getCanonicalPath());
}
}
- Compilar essa classe pelo comando javac, gerando um arquivo Caminho.class
C:\temp\teste_caminho>javac Caminho.java
C:\temp\teste_caminho>dir
11/16/2012 01:14 PM 698 Caminho.class
11/16/2012 01:08 PM 186 Caminho.java
2 File(s) 884 bytes
2 Dir(s) 160,674,414,592 bytes free
C:\temp\teste_caminho>
- Coloque o diretório onde está a classe no CLASSPATH, para que ela sempre possa ser encontrada:
C:\temp\teste_caminho>set CLASSPATH=C:\temp\teste_caminho
- Finalmente invoque a JVM para executar seu programa
C:\temp\teste_caminho>java Caminho
Path: C:\temp\teste_caminho
Alguém desavisado pararia aqui, concluindo que aquela linha de código realmente pega o caminho da aplicação. Mas experimente mudar o diretório e chamar a mesma classe novamente:
C:\temp\teste_caminho>cd C:\Users\rodrigo\Documents
C:\Users\rodrigo\Documents>java Caminho
Path: C:\Users\rodrigo\Documents
E eis o que acontece realmente: o construtor new File("") pega o diretório atual, independente de onde está seu aplicativo, as classes ou arquivos dependentes. Por coincidência, você pode iniciar o programa a partir de um diretório especificado e então vai dar certo.
Isso é uma solução?
Sem dúvida é uma opção a ser considerada. Mas como qualquer solução, para adotá-la é preciso se saber o que está fazendo e conhecer os riscos envolvidos. Se o desenvolvedor não sabe a idéia por trás da solução que adotou (está usando apenas porque testou em uma determinada situação e funcionou) ele pode vir a ter problemas que não faz idéia de onde procurar.
A programação por coincidência é sempre uma coisa muito perigosa!