Как читать файл свойств в веб-приложении?
Расположение файла свойств 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, которая имеет множество возможностей (перезаряжаемые файлы, несколько типов доменов), которые могут быть использованы в сочетании с приведенным выше.