2013-07-09 16 views
64

Czy istnieje sposób na uzyskanie ścieżki głównej klasy uruchomionego programu java.Jak uzyskać ścieżkę do uruchomienia programu java

struktura jest

D:/ 
|---Project 
     |------bin 
     |------src 

Chcę uzyskać ścieżkę jako D:\Project\bin\.

Próbowałem System.getProperty("java.class.path"); ale jest problem, jeśli biegnę jak

java -classpath D:\Project\bin;D:\Project\src\ Main 

Output 
Getting : D:\Project\bin;D:\Project\src\ 
Want : D:\Project\bin 

Czy istnieje jakiś sposób, aby to zrobić?



===== ===== EDIT

Got rozwiązanietutaj

przez Jon Skeet

package foo; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     ClassLoader loader = Test.class.getClassLoader(); 
     System.out.println(loader.getResource("foo/Test.class")); 
    } 
} 

Ta drukowana:

file:/C:/Users/Jon/Test/foo/Test.class 


przez Erickson

URL main = Main.class.getResource("Main.class"); 
if (!"file".equalsIgnoreCase(main.getProtocol())) 
    throw new IllegalStateException("Main class is not stored in a file."); 
File path = new File(main.getPath()); 

Należy zauważyć, że większość plików klas jest składana w pliki JAR, więc nie będzie to działać w każdym przypadku (stąd nazwa IllegalStateException). Można jednak zlokalizować plik JAR zawierający klasę za pomocą tej techniki i można uzyskać zawartość pliku klasy przez zastąpienie połączenia getResourceAsStream() zamiast getResource() i będzie działać bez względu na to, czy klasa znajduje się w systemie plików, czy w systemie. JAR.

+0

Cóż zawsze można tokenize wynik (cięcie wokół ";", który oddziela wpisy). Właściwość klasy clas zazwyczaj zawiera kilka pozycji (np. Bibliotek, których używasz i tak dalej). Może powinieneś przemyśleć swoje wymagania. Jeśli interesuje Cię tylko jeden folder, czy jesteś pewien, że parsowanie ścieżki klas jest dobrym pomysłem? – Matthias

+2

@Matthias Należy pamiętać, że separator ścieżek jest różny na różnych platformach. Lepiej jest użyć 'System.getProperty (" path.separator ");' –

+1

http://stackoverflow.com/a/778246/1862502 –

Odpowiedz

61

Spróbuj ten kod:

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

zastąpić 'MyClass' z klasa zawierająca główne metody.

Alternatywnie można również użyć

System.getProperty("java.class.path") 

Wyżej wymienionej nieruchomości System zapewnia

ścieżkę używaną znaleźć katalogi i archiwa JAR zawierających pliki klasowe. Elementy ścieżki klasy są oddzielone specyficznym dla platformy znakiem określonym we właściwości path.separator.

+0

getCodeSource() zwraca null w moim jvm (jetty) –

-2
ClassLoader cl = ClassLoader.getSystemClassLoader(); 

    URL[] urls = ((URLClassLoader)cl).getURLs(); 

    for(URL url: urls){ 
     System.out.println(url.getFile()); 
    } 
+1

to zazwyczaj powinno dać ci ścieżkę, od której zaczęła się twoja aplikacja. Nie musi to być miejsce, w którym znajduje się główna klasa. – Matthias

+0

Nie ma również gwarancji, że systemowy program ładujący klasy jest 'URLClassLoader' albo: P – Qix

18

Właściwie nie chcesz uzyskać ścieżki do głównej klasy. Zgodnie z twoim przykładem chcesz uzyskać bieżący katalog roboczy, tj. Katalog, w którym rozpoczął się twój program. W tym przypadku można po prostu powiedzieć new File(".").getAbsolutePath()

+2

Ze wszystkich odpowiedzi jest to najdokładniejsze – monzonj

109

Zastosowanie

System.getProperty("java.class.path") 

zobaczyć http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

Można też podzielić go na to jest pierwiastków łatwo

String classpath = System.getProperty("java.class.path"); 
String[] classpathEntries = classpath.split(File.pathSeparator); 
+8

Nie widzę, jak ta odpowiedź jest pytanie bądź szczery. Właściwość systemowa "java.class.path" zwraca całą ścieżkę klas, plików JAR i wszystko. OP pyta o ścieżkę do działającej głównej klasy (katalogu roboczego). – monzonj

+0

Katalog roboczy niekoniecznie znajduje się tam, gdzie są uruchamiane pliki klas. Dowodzi tego przykład PO. Podczas gdy ta odpowiedź obejmuje wszystkie lokalizacje komponentów projektu, pokazuje, w jaki sposób można je rozdzielić na ich elementy. – Larry

+6

@monzonj Zgadzam się z tobą. Pytanie rozwinęło się po tym, jak na nie odpowiedziałem. Tak więc moja odpowiedź już się nie zgadzała. Ale w międzyczasie wiele osób uznało tę odpowiedź za przydatną, ponieważ pasuje do nagłówka. Dlatego wciąż go przechowuję i nie usuwam. –

Powiązane problemy