2009-08-19 19 views
5

Estoy creando un archivo JAR ejecutable que se leerá en un conjunto de propiedades en tiempo de ejecución desde un archivo. La estructura de directorios será algo como:Lectura del archivo de propiedades del directorio JAR

/some/dirs/executable.jar 
/some/dirs/executable.properties 

¿Hay una manera de fijar la clase cargador de propiedad en el archivo executable.jar para cargar las propiedades del directorio que el frasco se encuentra, en lugar de la codificación dura de la directorio.

No quiero poner las propiedades en el propio contenedor ya que el archivo de propiedades debe ser configurable.

+0

posible duplicado de http://stackoverflow.com/questions/775389/accessing-properties-files-outside-the-jar –

Respuesta

12

¿Por qué no acaba de pasar el archivo de propiedades como argumento para su método principal? De esa manera, puede cargar las propiedades como sigue:

public static void main(String[] args) throws IOException { 
    Properties props = new Properties(); 
    props.load(new BufferedReader(new FileReader(args[0]))); 
    System.setProperties(props); 
} 

La alternativa: Si se desea obtener el directorio actual del archivo JAR que hay que hacer algo desagradable como:

CodeSource codeSource = MyClass.class.getProtectionDomain().getCodeSource(); 
File jarFile = new File(codeSource.getLocation().toURI().getPath()); 
File jarDir = jarFile.getParentFile(); 

if (jarDir != null && jarDir.isDirectory()) { 
    File propFile = new File(jarDir, "myFile.properties"); 
} 

... donde MyClass es una clase dentro de su archivo jar. Sin embargo, no es algo que recomiendo: ¿qué sucede si su aplicación tiene múltiples instancias MyClass en classpath en diferentes archivos jar (cada jar en un directorio diferente)? es decir, nunca se puede garantizar realmente que MyClass se haya cargado desde el contenedor que cree que era.

0

public static void loadJarCongFile(Class Utilclass) 
 
    { 
 
     try{   
 
      String path= Utilclass.getResource("").getPath(); 
 
      path=path.substring(6,path.length()-1); 
 
      path=path.split("!")[0]; 
 
      System.out.println(path); 
 
      JarFile jarFile = new JarFile(path); 
 

 
       final Enumeration<JarEntry> entries = jarFile.entries(); 
 
       while (entries.hasMoreElements()) { 
 
        final JarEntry entry = entries.nextElement(); 
 
        if (entry.getName().contains(".properties")) { 
 
         System.out.println("Jar File Property File: " + entry.getName()); 
 
         JarEntry fileEntry = jarFile.getJarEntry(entry.getName()); 
 
         InputStream input = jarFile.getInputStream(fileEntry); 
 
         setSystemvariable(input);  
 
         InputStreamReader isr = new InputStreamReader(input); 
 
         BufferedReader reader = new BufferedReader(isr); 
 
         String line; 
 
        
 
         while ((line = reader.readLine()) != null) { 
 
          System.out.println("Jar file"+line); 
 
         } 
 
         reader.close(); 
 
        } 
 
       } 
 
     } 
 
     catch (Exception e) 
 
     { 
 
      System.out.println("Jar file reading Error"); 
 
     } 
 
    } 
 
    public static void setSystemvariable(InputStream input) 
 
    { 
 
    Properties tmp1 = new Properties(); 
 
     try { 
 
      tmp1.load(input); 
 

 
     for (Object element : tmp1.keySet()) { 
 
      System.setProperty(element.toString().trim(), 
 
          tmp1.getProperty(element.toString().trim()).trim()); 
 
      }  
 
     } catch (IOException e) { 
 
      System.out.println("setSystemvariable method failure"); 
 
     } 
 
    }

Cuestiones relacionadas