2013-07-09 29 views
64

C'è un modo per ottenere il percorso della classe principale del programma java in esecuzione.Come ottenere il percorso del programma java in esecuzione

struttura è

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

voglio ottenere il percorso come D:\Project\bin\.

ho cercato System.getProperty("java.class.path"); ma il problema è, se corro come

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

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

Esiste un modo per fare questo?



===== ===== EDIT

Ottenuto soluzione qui

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

Questo stampata:

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


By 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()); 

Si noti che la maggior parte dei file di classe sono assemblati in file JAR, quindi questo non funzionerà in ogni caso (da qui il IllegalStateException). Tuttavia, è possibile individuare il JAR che contiene la classe con questa tecnica e ottenere il contenuto del file di classe sostituendo una chiamata a getResourceAsStream() al posto di getResource() e ciò funzionerà indipendentemente dal fatto che la classe si trovi nel file system o in un JAR.

+0

Beh si potrebbe sempre tokenize il risultato (taglio attorno al ";" che separa le voci). La proprietà classpath contiene in genere diverse voci (ad esempio librerie in uso e così via). Forse dovresti ripensare alle tue esigenze. Se sei interessato solo a una cartella, sei sicuro che l'analisi del classpath sia una buona idea? – Matthias

+2

@Matthias Si noti che il separatore del percorso è diverso su piattaforme diverse. È meglio usare 'System.getProperty (" path.separator ");' –

+1

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

risposta

61

provare questo codice:

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

sostituire 'MyClass' con la classe che contiene il metodo principale.

In alternativa è anche possibile utilizzare

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

Sopra proprietà di sistema illustrati fornisce

percorso utilizzato per trovare le directory e gli archivi JAR che contengono file di classe. Gli elementi del percorso classe sono separati da un carattere specifico della piattaforma specificato nella proprietà path.separator.

+0

getCodeSource() restituisce null nel mio jvm (jetty) –

-2
ClassLoader cl = ClassLoader.getSystemClassLoader(); 

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

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

questo di solito dovrebbe darti solo il percorso da dove è stata avviata la tua applicazione. Questo non ha bisogno di essere dove si trova la tua classe principale. – Matthias

+0

Non è nemmeno garantito che il programma di caricamento di classe del sistema sia un 'URLClassLoader': P – Qix

18

In realtà non si desidera ottenere il percorso per la classe principale. Secondo il tuo esempio, vuoi ottenere la directory di lavoro corrente, cioè la directory in cui è stato avviato il tuo programma. In questo caso si può solo dire new File(".").getAbsolutePath()

+2

Da tutte le risposte questo è il più preciso – monzonj

109

Usa

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

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

Si può anche dividere in esso è elementi facilmente

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

Non vedo come questa risposta la domanda a essere onesti. La proprietà di sistema 'java.class.path' restituisce l'intero classpath, le JAR e tutto il resto. L'OP chiede il percorso della classe principale in esecuzione (directory di lavoro). – monzonj

+0

La directory di lavoro non è necessariamente da dove vengono eseguiti i file di classe. L'esempio fornito dall'OP lo dimostra. Mentre questa risposta include tutte le posizioni dei componenti del progetto, mostra come puoi separarli nei loro elementi. – Larry

+6

@monzonj Sono d'accordo con te. La domanda si è evoluta dopo che ho risposto. Quindi la mia risposta non corrispondeva più. Ma nel frattempo un sacco di persone hanno trovato utile la risposta, perché si adatta al titolo. È per questo che lo tengo e non lo elimini. –

Problemi correlati