2012-07-31 5 views
44

Esiste un modo per determinare il percorso corrente del file della classe eseguita dal codice di questa classe, in runtime, dato che viene eseguito utilizzando il comando java?Ottenere il percorso di classe del file in esecuzione

Ad esempio per le seguenti classe:

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

} 

Esiste un modo per ottenere e stampare il percorso corretto nel file system del file di MyClass.class solo di essere invocato?

Analogamente, se invoco il file jar dal comando java -jar, esiste un modo per ottenere un percorso del file jar all'interno delle classi all'interno di tale jar?

P.S.:Si prega, non fare ipotesi sulla directory di lavoro da cui è stato richiamato il comando java!

risposta

68

Il seguente frammento di codice farà questo per voi:

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

sostituire MyClass con la classe main

La risultante File oggetto f rappresenta il file .jar che è stata eseguita. È possibile utilizzare questo oggetto per ottenere il genitore per trovare la directory in cui è .jar

+5

Attenzione quando si esegue questa operazione: se il file di classe si trova in una directory che contiene uno spazio, la stringa restituita (che è il parte del percorso di un URL, che getLocation() restituisce, ed è quindi codificato URL) conterrà '% 20' invece di spazi! –

+1

@JandeVos L'uso del costruttore 'File (java.net.URI)' sembra risolvere il problema. – Spooky

+0

@ Commento di Spooky: quindi deve essere 'File finale f = nuovo File (MyClass.class.getProtectionDomain(). GetCodeSource(). GetLocation(). GetURI(). GetPath());' –