Как читать файл свойств в веб-приложении?

Расположение файла свойств WEB-INF/classes/auth.properties.

Я не могу использовать JSF-специфичные способы (с ExternalContext), потому что мне нужен файл свойств в сервисном модуле, который не имеет зависимости от веб-модуля.

Я уже пробовал

MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties");

но возвращает null.

Я также пытался прочитать его с помощью FileInputStream, но он требует полного пути, что неприемлемо.

Любые идеи?

Ответы

Ответ 1

Несколько примечаний:

  • Вы должны предпочесть ClassLoader, возвращенный Thread#getContextClassLoader().

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    

    Это возвращает родительский загрузчик классов, который имеет доступ к ресурсам all. Class#getClassLoader() возвращает только (дочерний) загрузчик классов рассматриваемого класса, который сам по себе не может получить доступ к требуемому ресурсу. Он всегда будет работать в средах с одним загрузчиком классов, но не всегда в средах со сложной иерархией загрузчиков классов, таких как webapps.

  • В папке /WEB-INF нет корня пути к классам. Папка /WEB-INF/classes. Поэтому вам нужно загрузить файлы свойств относительно этого.

    classLoader.getResourceAsStream("/auth.properties");
    

    Если вы решите использовать Thread#getContextClassLoader(), удалите ведущий /.

JSF-специфический ExternalContext#getResourceAsStream(), который использует ServletContext#getResourceAsStream() "под капотами" возвращает ресурсы только из webcontent (там, где сидит папка /WEB-INF), а не из пути к классам.

Ответ 2

Попробуйте следующее:

MyService.class.getClassLoader().getResourceAsStream("/auth.properties");

Чтение файлов с помощью getResourceAsStream показывает путь к классам, чтобы найти загружаемый ресурс. Поскольку каталог classes находится в пути к классам для вашего веб-приложения, ссылка на файл как /auth.properties должна работать.

Ответ 3

ResourceBundle (http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html) устраняет большинство проблем с пути относительного/абзаца для файлов свойств.

Он использует класс Resource и указывает его на класс Dummy для ссылки на файл свойств.

Например:

  • У вас есть файл MAINProperties.properties и внутри него есть свойство: mail.host = foo.example.com
  • Создайте класс Dummy под названием MAINProperties без ничего.
  • Используйте следующий код:

    ResourceBundle.getBundle( "com.example.com.MAINProperties" ). GetProperty ( "mail.host" )

И Что это. Нет входных потоков.

P.D. Apache Commons имеет Библиотеку, названную Apache Commons Configuration, которая имеет множество возможностей (перезаряжаемые файлы, несколько типов доменов), которые могут быть использованы в сочетании с приведенным выше.