Загрузка файла внешних свойств в одноуровневую директорию - PullRequest
1 голос
/ 28 февраля 2012

по сценарию

./
 config/
    application.properties
 lib/
    properties-loader-0.0.1-SNAPSHOT.jar
 acme.sh

properties-loader-0.0.1-SNAPSHOT.jar - это исполняемый файл с файлом манифеста. В банке есть одна упаковка com.acme.lab, содержащая только класс с полным именем com.acme.lab.PropertiesLoader.

Сценарий acme.sh выполняет следующую команду:

java -cp etc/application.properties:./lib/properties-loader-0.0.1-SNAPSHOT.jar com.acme.lab.PropertiesLoader

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

System.out.println(this.getClass().getResourceAsStream("../etc/application.properties"));
System.out.println(this.getClass().getResourceAsStream("etc/application.properties"));
System.out.println(this.getClass().getResourceAsStream("/etc/application.properties"));
System.out.println(this.getClass().getResourceAsStream("application.properties"));

System.out.println(this.getClass().getClassLoader().getResourceAsStream("../etc/application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("etc/application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("/etc/application.properties"));
System.out.println(this.getClass().getClassLoader().getResourceAsStream("application.properties"));

try {
    System.out.println(ResourceBundle.getBundle("etc.application"));
    System.out.println(ResourceBundle.getBundle("application"));
} catch(MissingResourceException e) {
    // do nothing
}

Все эти вызовы не могут загрузить файл.

Я просто знаю, что ошибка имеет какое-то отношение к пути к классам, но не могу найти его. Я создал пример проекта maven на github , который воссоздает проблему.

1 Ответ

4 голосов
/ 28 февраля 2012

Ресурсы интерпретируются по их корням пути к классам. Что в вашем случае, когда вы запускаете свою программу так:

java -cp etc/application.properties:./lib/properties-loader-0.0.1-SNAPSHOT.jar

корни

  • ./etc/application.properties
  • ./lib/properties-loader-0.0.1-SNAPSHOT.jar

Ни один из этих файлов не содержит ваш файл application.properties (как подресурс). Если вы изменили свою команду следующим образом:

java -cp etc:./lib/properties-loader-0.0.1-SNAPSHOT.jar

Тогда вы можете прочитать ваш файл свойств в вашей программе как:

Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties");

В качестве дополнительного примечания всегда лучше использовать полные пути в настройках пути к классам.


* РЕДАКТИРОВАТЬ *

Это рабочий пример, который должен иллюстрировать загрузку ресурса:

mkdir props; cd props
mkdir etc; touch etc/application.properties
mkdir test; vi test/PropLoader.java

Вставьте этот контент в редактор и сохраните:

package test;

import java.io.InputStream;

public class PropLoader {
   public static void main(String[] args) {
      try {
         final String path;
         if(args.length == 1) path = args[0].trim();
         else path = "etc/application.properties";

         final InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
         if(is == null) throw new RuntimeException("Failed to load " + path + " as a resource");
         else System.out.printf("Loaded resource from path: %s\n", path);
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

И для проверки:

javac test/PropLoader.java
java -cp . test.PropLoader

Вывод Loaded resource from path: etc/application.properties.

...