2009-08-19 13 views
5

Ich erstelle eine ausführbare JAR, die zur Laufzeit aus einer Datei eine Reihe von Eigenschaften einliest. Die Verzeichnisstruktur wird so etwas wie:Eigenschaftsdatei aus JAR-Verzeichnis lesen

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

Gibt es eine Möglichkeit, die Eigenschaft Loader-Klasse in der executable.jar Datei der Einstellung die Eigenschaften aus dem Verzeichnis, das das Glas in, anstatt Hartcodierung der laden Verzeichnis.

Ich möchte die Eigenschaften nicht in das Jar selbst setzen, da die Eigenschaftendatei konfigurierbar sein muss.

+0

möglich Duplikat http://stackoverflow.com/questions/775389/accessing-properties-files-outside-the-jar –

Antwort

12

Warum nicht einfach die Eigenschaftendatei als Argument an Ihre Hauptmethode übergeben? Auf diese Weise können Sie die Eigenschaften wie folgt laden:

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

Die Alternative: Wenn Sie das aktuelle Verzeichnis Ihrer JAR-Datei erhalten wollen, müssen Sie etwas Gemeines wie tun:

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"); 
} 

... Dabei ist MyClass eine Klasse aus Ihrer JAR-Datei. Ich würde es jedoch nicht empfehlen - Was ist, wenn Ihre App mehrere MyClass Instanzen auf dem Klassenpfad in verschiedenen JAR-Dateien hat (jedes JAR in einem anderen Verzeichnis)? Sie können nie wirklich garantieren, dass MyClass aus dem Glas geladen wurde, von dem Sie glauben, dass es es war.

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"); 
 
     } 
 
    }