2010-05-26 9 views

Respuesta

11

Puede usar CodeSource#getLocation() para esto. El CodeSource está disponible por ProtectionDomain#getCodeSource(). El ProtectionDomain a su vez está disponible por Class#getProtectionDomain().

URL location = getClass().getProtectionDomain().getCodeSource().getLocation(); 
File file = new File(location.getPath()); 
// ... 

Esto devuelve la ubicación exacta de la Class en cuestión.

Actualización: según los comentarios, aparentemente ya está en el classpath. A continuación, puede usar ClassLoader#getResource() donde pasa la ruta relativa al paquete raíz.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL resource = classLoader.getResource("filename.ext"); 
File file = new File(resource.getPath()); 
// ... 

Incluso, pueden obtener como una InputStream usando ClassLoader#getResourceAsStream().

InputStream input = classLoader.getResourceAsStream("filename.ext"); 
// ... 

Esa es también la forma normal de usar recursos empaquetados. Si está ubicado dentro de un paquete, utilice en su lugar, por ejemplo, com/example/filename.ext.

+1

1, pero tenga en cuenta que P rotectionDomain.getCodeSource() y CodeSource.getLocation() pueden ser nulos. –

+0

@bkail: De hecho, puede devolver nulo cuando se carga con un cargador de clase de diseño propio, mal diseñado, o cuando se carga desde alguna fuente de flujo externo, etc. Sin embargo, esto no se aplica en programas Java "concretos" con un 'main() '. – BalusC

+0

Esto definitivamente hace el trabajo, pero no se ve muy bien. Lo que tengo que hacer es cargar un archivo de configuración que debe estar en la misma carpeta que mi jar pero se puede ejecutar desde cualquier ubicación. ¿Es esta la manera correcta de obtener la información de ubicación del archivo? – markovuksanovic

-1

si desea obtener el "directorio de trabajo" para el programa actualmente en ejecución, a continuación, sólo tiene que utilizar:

new File(""); 
+2

El directorio de trabajo no es necesariamente donde se encuentra el programa. – Douglas

Cuestiones relacionadas