2012-07-31 9 views
44

Czy istnieje sposób ustalenia aktualnej lokalizacji systemu plików wykonywanej klasy z kodu tej klasy, w czasie wykonywania, biorąc pod uwagę, że jest wykonywany przy użyciu polecenia java?Uzyskiwanie ścieżki do systemu plików klasy, która jest wykonywana

Na przykład dla następujących klas:

public class MyClass{ 
public static void main(String[] args){\ 
    new MyClass().doStuff(); 
} 

private void doStufF(){ 
    String path = ... // what to do here?! 
    System.out.println("Path of class being invoked: " + path); 
} 

} 

Czy istnieje jakiś sposób, aby uzyskać i wydrukować odpowiednią ścieżkę w systemie plików plik MyClass.class właśnie powołano?

Podobnie, jeśli wywołuję plik JAR z komendy java -jar, czy istnieje sposób uzyskania ścieżki pliku jar z klas wewnątrz tego słoika?

P.S.:Proszę, nie należy przyjmować żadnych założeń dotyczących katalogu roboczego, od którego wywoływana jest komenda java!

Odpowiedz

68

Poniższy fragment kodu zrobi to za ciebie:

final File f = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()); 

zastąpić MyClass z klasy main

Powstały obiekt fFile reprezentuje plik .jar, który został wykonany. Możesz użyć tego obiektu, aby uzyskać rodzic, aby znaleźć katalog, w którym znajduje się .jar.

+5

Uwaga: jeśli plik klasy znajduje się w katalogu, który zawiera spacje, zwracany ciąg (który jest część ścieżki adresu URL, która zwraca getLocation(), a zatem jest zakodowana w postaci adresu URL) będzie zawierała "% 20" zamiast spacji! –

+1

@JandeVos Konstruktor 'File (java.net.URI)' wydaje się naprawić ten problem. – Spooky

+0

@ Spooky's comment: więc musi to być 'final File f = new File (MyClass.class.getProtectionDomain(). GetCodeSource(). GetLocation(). GetURI(). GetPath());' –