2010-05-14 12 views

Respuesta

61

No es una solución perfecta, pero la ubicación Esto devolverá la clase de la base de código:

getClass().getProtectionDomain().getCodeSource().getLocation() 
+18

¿No es perfecto? Esto es realmente el más confiable ya que las otras sugerencias propuestas devuelven el ** directorio de trabajo actual ** que no es per se la carpeta donde se encuentra el JAR. P.ej. si haces 'cd/somefolder' y luego' java -jar/otherfolder/file.jar' entonces otras sugerencias devolverán '/ somefolder'. +1. – BalusC

+1

¿Entonces esta solución realmente devolverá '/ otherfolder'? – aioobe

+0

@aioobe: Exactamente. – BalusC

11
new File(".").getAbsolutePath() 
+1

+1 ¡Ah, eso es inteligente! –

+21

Como dijo @Will Hartung, "el directorio actual puede no tener nada que ver con dónde se encuentra el jar de ejecución". – aioobe

+0

Hay un código mucho más pequeño que este. 'new File (" "). getAbsolutePath();' – MacStevins

1

esto parece una pregunta dudoso para comenzar con.

Si estoy ejecutando código en Java, se está quedando sin rt.jar y probablemente una docena de otros jarrones.

Los primeros archivos que se ejecutarán estarán en rt.jar, rt.jar llamará a su principal.

Si escribe una clase que le permite saber qué jar está ejecutando y esa clase se mueve a un jar diferente, entonces ya no se está "quedando sin" el jar que contenía su main.

Creo que lo que quiere es la línea de comando que inició su aplicación, pero si primero hizo CD en el directorio, puede que no tenga la ruta completa a su jar.

Además, puede que no esté ejecutándose desde un contenedor: alguien podría haber expandido su jar en clases en un directorio y lo está ejecutando de esa manera.

Personalmente, simplemente envolvería su programa en un iniciador de script de shell donde podría ver su ubicación actual y la ubicación del archivo jar y luego pasarlas a Java.

+0

Buen punto, nuestra aplicación está envuelta en un gran contenedor (desafortunadamente). – darrickc

2

considera la siguiente función

//This method will work on Windows and Linux as well.  
    public String getPath(){ 
     URL rootPath = getClass().getResource(""); 
     String URI=rootPath.toString().substring(9); 
     String[] currentPath=URI.split("myjar.jar!"); 
     currentPath[0]=currentPath[0].replaceAll("%20"," "); 
     return currentPath[0]; 
     } 
7

Aquí es mi método para obtener ruta de ejecución desde cualquier lugar

private static String GetExecutionPath(){ 
    String absolutePath = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 
    absolutePath = absolutePath.substring(0, absolutePath.lastIndexOf("/")); 
    absolutePath = absolutePath.replaceAll("%20"," "); // Surely need to do this here 
    return absolutePath; 
} 
+0

puede usar URLDecoder.decode (directoryPath, "UTF-8"); para reemplazar% 20 con espacio –

+0

también puede usar absolutePath.lastIndexOf (File.separator) para admitir todo el sistema operativo –

Cuestiones relacionadas