Загрузить файл конфигурации из войны

У меня есть проект Maven, который я пытаюсь упаковать как в войну, так и в банку. В рамках инициализации моего приложения/сервлета (в зависимости от того, запускаю ли я банку или войну) мне нужно прочитать файл с именем server.ini. Я поместил файл в src/main/resources/server.ini и пытаюсь загрузить его так:

System.class.getResourceAsStream("server.ini");

Однако это всегда приводит к null. Что я делаю неправильно?


person Josh Glover    schedule 14.02.2014    source источник


Ответы (3)


Файл server.ini должен находиться в корне каталога ресурсов.

Поместив его в webapp, вы сделаете файл доступным через http, но вам нужно, чтобы он был доступен в classpath, а это значит, что вы должны поместить его в каталог ресурсов.

person Software Engineer    schedule 14.02.2014
comment
Это именно то, что я хочу сделать: загрузить файл конфигурации в качестве ресурса, чтобы он работал независимо от того, запускаю ли я войну или банку. Я обновил свой вопрос, чтобы сделать это более понятным. Однако моя попытка загрузить файл в качестве ресурса не удалась как на банке, так и на войне. Я уверен, что делаю что-то тривиальное неправильно, но не могу понять, что это такое. :-/ - person Josh Glover; 14.02.2014
comment
Вы строите с maven? Помещение файла в каталог ресурсов приведет к тому, что он окажется там, где должен быть. Если вы поместите его в подкаталог ресурсов, вам необходимо настроить строку java, чтобы она также ссылалась на подкаталоги. - person Software Engineer; 14.02.2014
comment
И теперь я знаю, что такое тривиальная ошибка: мне нужно было предварять имя файла косой чертой, иначе загрузчик классов искал в java.lang. Итак, это работает: this.getClass().getResourceAsStream("/server.ini") - person Josh Glover; 14.02.2014

Есть большая вероятность, что web.xml или context.xml лучше подходят для того, что вы пытаетесь сделать, но...

Попробуйте поместить server.ini в WEB-INF/classes или сделать что-то вроде это.

person David Ehrmann    schedule 14.02.2014
comment
Вы не должны помещать что-либо непосредственно в WEB-INF/classes. Maven очистит этот каталог, когда вы скажете ему очистить, и вы потеряете свой файл. Этот каталог фактически находится под контролем maven. - person Software Engineer; 14.02.2014
comment
Но я согласен с тем, что вам, вероятно, лучше использовать web.xml для настройки вашего сервера. - person Software Engineer; 14.02.2014
comment
Если бы я запускал это только в контейнере сервлетов, я мог бы использовать web.xml. Тем не менее, мне нужно, чтобы он выбежал из банки. - person Josh Glover; 14.02.2014

Проблема заключалась в том, что я использовал системный загрузчик классов с неполным путем, поэтому он ожидал найти мой server.ini в пакете java.lang.

Поскольку мой файл находится в src/main/resources, я должен просто использовать загрузчик классов моего текущего класса с абсолютным путем:

getClass().getResourceAsStream("/server.ini")

Это работает как на войне, так и в банке.

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

person Josh Glover    schedule 14.02.2014