Как читать файл свойств в веб-приложении?
Расположение файла свойств 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 для ссылки на файл свойств.
Например:
И Что это. Нет входных потоков.
P.D. Apache Commons имеет Библиотеку, названную Apache Commons Configuration, которая имеет множество возможностей (перезаряжаемые файлы, несколько типов доменов), которые могут быть использованы в сочетании с приведенным выше.