FileNotFoundException, когда я указал относительный путь к файлу свойств

Я пытаюсь использовать файл свойств для хранения сведений о подключении к БД. Это сработало, когда я создал приложение Java и дал имя файла как есть, поскольку я поместил файл свойств в корневую папку проекта.

Однако я получаю FileNotFoundException, когда пытаюсь сделать это в своем веб-приложении. Я создал каталог res в узле проекта для хранения файла свойств. Затем я указал путь как «res/db.properties», но получаю исключение. Я также попытался поместить этот файл в каталог файлов конфигурации, но все равно получил то же исключение.

Вот мой код -

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.util.Properties;

    /**
     *
     * @author aj
     */
    public class getConfigValues {

        public String[] getPropValues() {
            String[] props = new String[4];

            try {
                Properties prop = new Properties();
                String propFileName = "res/db.properties";

                InputStream input = null;

                input = new FileInputStream(propFileName);
                prop.load(input);

                props[0] = prop.getProperty("dbURL");
                props[1] = prop.getProperty("driverClass");
                props[2] = prop.getProperty("user");
                props[3] = prop.getProperty("password");

                return props;

            } catch (FileNotFoundException ip) {

                props[0] = "not found";

                return props;
            } catch (IOException i) {
                props[0] = "IO";

                return props;

            }

        }
    }

Что я здесь делаю неправильно?


person Ajay Kelkar    schedule 08.09.2014    source источник
comment
Является ли res исходной папкой? Вместо этого попробуйте использовать db.properties напрямую.   -  person sp00m    schedule 08.09.2014
comment
Да, я пробовал это перед публикацией. Я добавил res в качестве папки исходного пакета, а затем запустил веб-приложение, но все равно получил файл FileNotFoundException. Непосредственное указание имени файла также не сработало (это была моя первая настройка - файл prop в корне проекта).   -  person Ajay Kelkar    schedule 08.09.2014


Ответы (3)


  • Как веб-приложение, у вас нет возможности предсказать текущий рабочий каталог, поэтому использование относительного пути всегда будет проблематичным;
  • В зависимости от того, как упаковано ваше веб-приложение, ваш файл свойств может даже не быть объектом файловой системы. Это вполне может быть ресурс, спрятанный в файле .war.

Один из надежных способов получить доступ к этому файлу — встроить его в каталог WEB-INF вашего веб-приложения. Затем вы можете получить к нему доступ, используя javax.servlet.ServletContext.getResourceAsStream("WEB-INF/res/db.properties").

В качестве альтернативы вы можете встроить его в каталог WEB-INF/classes и загрузить с помощью java.lang.ClassLoader.getResourceAsStream("/res/db.properties").

person Steve C    schedule 08.09.2014
comment
После запуска процесса Java вы не можете изменить его текущий каталог. Функции getRessource — лучший способ поиска файлов. - person Vouze; 08.09.2014
comment
@Steve Отмечено - Спасибо! Я смог решить свою проблему, следуя инструкциям в этот вопрос . Но у меня все еще есть сомнения. Чем это отличается от простого помещения сведений о моем соединении в переменные и их использования? Если я буду следовать этому подходу, мне придется заменить файл WAR и повторно развернуть его. Моя идея использования файла prop заключалась в том, чтобы я мог использовать его и эффективно изменять детали подключения к БД без необходимости повторного развертывания всего приложения. - person Ajay Kelkar; 09.09.2014
comment
Теперь вы задаете лучший вопрос! Обычная стратегия состоит в том, чтобы настроить источник данных на вашем сервере приложений, найти его (или внедрить) в ваше приложение, а затем использовать его для подключения к базе данных. Это помещает всю информацию, связанную с подключением, в конфигурацию сервера, а не в ваше приложение. - person Steve C; 10.09.2014

Скорее всего, текущий каталог отличается, когда вы запускаете его как веб-приложение... Существует свойство System, которое сообщит вам, что такое текущий каталог. Или вы можете использовать Class.getResource, чтобы использовать ваш путь к классам, чтобы найти каталог res

person ControlAltDel    schedule 08.09.2014

Ваша основная ошибка заключается в попытке загрузить ресурс с классами, связанными с файлами. Файлы свойств являются ресурсами приложения и поэтому должны размещаться относительно этого приложения.

«Относительно» означает «в пути класса».

В автономном приложении просто укажите каталог этих ресурсов как часть пути к классу. В веб-приложении каталог WEB-INF/classes уже является частью пути к классу приложения.

Теперь вторая часть ответа: Как загрузить такие ресурсы? Просто: с ClassLoader. В его обязанности входит не только загрузка классов, но и загрузка ресурсов (например, файлов свойств).

Идите с этим (обработка исключений опущена):

ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL resourceUrl = loader.getResource("res/db.properties");
Properties properties = new Properties();
try(InputStream input = resourceUrl.openStream()) {
    properties.load(input);
}
String[] result = new String[4];
...
return result;
person Seelenvirtuose    schedule 08.09.2014