Чтение файла свойств из каталога JAR - PullRequest
5 голосов
/ 19 августа 2009

Я создаю исполняемый JAR-файл, который будет читать набор свойств во время выполнения из файла. Структура каталогов будет выглядеть примерно так:

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

Существует ли способ задания класса загрузчика свойств в файле executetable.jar для загрузки свойств из каталога, в котором находится jar, вместо жесткого кодирования каталога.

Я не хочу помещать свойства в саму флягу, поскольку файл свойств должен быть настраиваемым.

Ответы [ 2 ]

13 голосов
/ 19 августа 2009

Почему бы просто не передать файл свойств в качестве аргумента вашему методу main?Таким образом, вы можете загрузить свойства следующим образом:

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

Альтернатива: если вы хотите получить текущий каталог вашего jar-файла, вам нужно сделать что-то неприятное, например:

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

... где MyClass - это класс из вашего файла jar.Это не то, что я бы порекомендовал - а что, если у вашего приложения есть несколько MyClass экземпляров в classpath в разных файлах jar (каждый jar в своем каталоге)?то есть вы никогда не сможете гарантировать, что MyClass был загружен из банки, которую вы считаете.

0 голосов
/ 23 января 2015

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