2009-04-22 12 views
14

Tengo un archivo .jar que estoy reuniendo. Quiero crear un archivo .properties realmente muy simple con cosas configurables como el nombre del usuario & otras cosas, para que puedan editar a mano en lugar de tener que incluir un editor de GUI.¿Accediendo a archivos de propiedades fuera de .jar?

Lo que me gustaría hacer es ser capaz de buscar, en este orden:

  1. un archivo de propiedades especificado (args[0])
  2. MyApp.properties en el directorio actual (el directorio desde el cual Java se llamaba)
  3. MyApp.properties en el directorio del usuario (la propiedad user.home sistema?)
  4. MyApp.properties en el directorio donde se almacena la aplicación .jar

Sé cómo acceder a # 1 y # 3 (creo), pero ¿cómo puedo determinar en tiempo de ejecución # 2 y # 4?

Respuesta

6

# 2 es la propiedad del sistema "user.dir". # 3 es la propiedad "user.home".

# 4 es un poco complicado, no importa cómo te acerques. Aquí hay una técnica alternativa que funciona si tiene una clase cargada desde un JAR que no está en el classpath del sistema.

CodeSource src = MyClass.class.getProtectionDomain().getCodeSource(); 
if (src != null) { 
    URL url = new URL(src.getLocation(), "MyApp.properties"); 
    ... 
} 
else { 
    /* Fail... */ 
} 
+0

funciona muy bien. :-) ¡Gracias! –

+0

@erickson ¡funciona! pero si tengo MyApp.properties dentro de un contenedor y en el directorio externo (no dentro de ningún paquete). Entonces, ¿cómo leerlo? – Achyut

6

Para el directorio de trabajo actual:

new File("."); 

Para un archivo MyApp.properties nombre en el directorio actual:

new File(new File("."), "MyApp.properties"); 
+3

Eso funciona, pero aún más corto es pasar cadena vacía (nuevo archivo ("")) – StaxMan

+0

¡Aprendí algo! Gracias :) –

10

Para 4, puede probar esto. Obtener la ruta de clase:

String classpath = System.getProperty("java.class.path"); 

A continuación, busque por el nombre de su frasco de aplicación:

int jarPos = classpath.indexOf("application.jar"); 

analizar fuera de la ruta que conduce a ella:

int jarPathPos = classpath.lastIndexOf(File.pathSeparatorChar, jarPos) + 1; 
String path = classpath.substring(jarPathPos, jarPos); 

continuación, anexar MyApp.properties. Asegúrese de verificar jarPos == -1, lo que significa que el jar no se encuentra si el classpath (tal vez cuando se ejecuta en su entorno de desarrollo).

+0

He estado buscando esto por 1 semana, donde sea que hayan dicho usan 'Main.class.getProtectionDomain(). GetCodeSource()', que NO FUNCIONA !!! al menos no en Mac desde el contenido de un archivo .app ... Pero esto finalmente resolvió mi problema ... Muchas gracias ... –

Cuestiones relacionadas