504 votos

¿Cómo obtener la ruta de un archivo JAR de corriente?

Mi código funciona dentro de un archivo JAR, dice foo.jar, y necesito saber, en el código, en que carpeta es la corriente foo.jar.

Así que, si foo.jar está en C:\FOO\ , quiero que ese camino sea cual sea mi directorio de trabajo actual.

465voto

Zarkonnen Puntos 11086
return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath().toURI());

Obviamente, esto hará cosas raras si su clase fue cargada desde una ubicación de archivo no.

178voto

Fab Puntos 1099

Mejor solución para mí:

String path = Test.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String decodedPath = URLDecoder.decode(path, "UTF-8");

Esto debería solucionar el problema con espacios y caracteres especiales.

138voto

ctrueden Puntos 1292

Para obtener el File para un determinado Class, hay que seguir dos pasos:

  1. Convertir la Class a URL
  2. Convertir la URL a File

Es importante entender tanto los pasos, y no se confunden con ellos.

Una vez que usted tiene la File, usted puede llamar a getParentFile para obtener la carpeta que lo contiene, si eso es lo que usted necesita.

Paso 1: Class a URL

Como se discutió en otras respuestas, hay dos grandes maneras de encontrar un URL correspondiente a un Class.

  1. URL url = Bar.class.getProtectionDomain().getCodeSource().getLocation();

  2. URL url = Bar.class.getResource(Bar.class.getSimpleName() + ".class");

Ambas tienen pros y contras.

La getProtectionDomain enfoque de los rendimientos de la base de la ubicación de la clase (por ej., el que contiene el archivo JAR). Sin embargo, es posible que el Java de tiempo de ejecución de la política de seguridad va a tirar SecurityException cuando se llama a getProtectionDomain(), por lo que si su aplicación necesita para funcionar en una variedad de ambientes, lo mejor es probar en todos ellos.

La getResource enfoque de los rendimientos de la dirección URL completa ruta de acceso a recursos de la clase, de la que tendrá que llevar a cabo adicionales de manipulación de cadenas. Puede ser un file: ruta, pero también podría ser jar:file: o incluso algo más desagradable como bundleresource://346.fwk2106232034:4/foo/Bar.class cuando se ejecuta dentro de un framework OSGi. Por el contrario, la getProtectionDomain enfoque correctamente los rendimientos de un file: de URL, incluso desde dentro de OSGi.

Tenga en cuenta que tanto getResource("") y getResource(".") fallado en mis pruebas, cuando la clase residido dentro de un archivo JAR; ambas invocaciones devuelve null. Así que os recomiendo el #2 de invocación se muestra arriba en su lugar, como parece más seguro.

Paso 2: URL a File

De cualquier manera, una vez que usted tiene un URL, el siguiente paso es convertir a un File. Esta es su propio reto, a ver Kohsuke Kawaguchi entrada en el blog sobre ella para ver todos los detalles, pero, en resumen, puede utilizar new File(url.toURI()) siempre que la dirección URL es completamente correcto.

Por último, me gustaría desaconseja encarecidamente el uso de URLDecoder. Algunos caracteres de la URL, : y / , en particular, no son válidos URL de caracteres codificados. Desde el URLDecoder Javadoc:

Se supone que todos los caracteres en la cadena codificada son una de las siguientes: "a" a la "z", la "a" a la "Z", "0" a "9", y"-", "_", ".", y "*". El carácter "%" está permitido, pero se interpreta como el inicio de un especial escapado de la secuencia.

...

Hay dos formas posibles en que este decodificador no podía hacer frente a la ilegal cadenas. Podría irse de ilegal personajes solos o podría lanzar un IllegalArgumentException. El enfoque que el decodificador se toma a la izquierda de la aplicación.

En la práctica, URLDecoder generalmente no se lanza IllegalArgumentException como amenazadas por encima. Y si su ruta de acceso del archivo tiene espacios codificados como %20, este enfoque puede parecer funciona. Sin embargo, si la ruta de acceso del archivo tiene otros no alphameric personajes como + va a tener problemas con URLDecoder destrozando su ruta de acceso del archivo.

47voto

Benny Neugebauer Puntos 5393
También puede utilizar

22voto

Jon Skeet Puntos 692016

Utilice ClassLoader.getResource() para buscar la URL de su clase actual.

Por ejemplo:

package foo;

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

(Este ejemplo tomado de una pregunta similar).

Para encontrar el directorio, entonces necesitas desmontar la URL manualmente. Consulte el tutorial de JarClassLoader para el formato de una dirección URL de tarro.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X