it-swarm.com.ru

Не удается загрузить файл свойств из каталога ресурсов

Я импортировал проект из репозитория Git и добавил в него природу Maven в Eclipse. В папке ресурсов я добавил файл конфигурации с именем myconf.properties. Теперь, когда я пытаюсь открыть этот файл из своего Java-кода, я получаю FileNotFoundException. Файл также присутствует в папке target/classes, сгенерированной после того, как maven скомпилирует проект.

Может кто-нибудь сказать мне, в чем может быть проблема? Мой код Java, который пытается загрузить этот файл:

props.load(new FileInputStream("myconf.properties"));

где props - это объект Properties.

Кто-нибудь может дать мне несколько советов о том, как решить эту проблему?

46
artaxerxe

Если файл помещается в target/classes после компиляции, то он уже находится в каталоге, который является частью пути сборки. Каталог src/main/resources является каталогом Maven по умолчанию для таких ресурсов, и он автоматически помещается в путь сборки с помощью подключаемого модуля Eclipse Maven (M2E). Таким образом, нет необходимости перемещать файл свойств.

Другая тема, как получить такие ресурсы. Ресурсы в пути сборки автоматически попадают в путь классов запущенной Java-программы. Учитывая это, вы всегда должны загружать такие ресурсы загрузчиком классов. Пример кода:

String resourceName = "myconf.properties"; // could also be a constant
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Properties props = new Properties();
try(InputStream resourceStream = loader.getResourceAsStream(resourceName)) {
    props.load(resourceStream);
}
// use props here ...
108
Seelenvirtuose

Я думаю, что вам нужно поместить его под src/main/resources и загрузить его следующим образом: 

props.load(new FileInputStream("src/main/resources/myconf.properties"));

То, как вы пытаетесь его загрузить, сначала проверит базовую папку вашего проекта. Если он находится в target/classes и вы хотите загрузить его оттуда, сделайте следующее:

props.load(new FileInputStream("target/classes/myconf.properties"));
16
VD'

Если это простое приложение, то также можно использовать getSystemResourceAsStream .

try (InputStream inputStream = ClassLoader.getSystemResourceAsStream("config.properties"))..
5
rns

Щелкните правой кнопкой мыши папку Resources и выберите Build Path > Add to Build Path

3
Kevin Bowersox

Я использую что-то вроде этого, чтобы загрузить файл свойств.

        final ResourceBundle bundle = ResourceBundle
                .getBundle("properties/errormessages");

        for (final Enumeration<String> keys = bundle.getKeys(); keys
                .hasMoreElements();) {
            final String key = keys.nextElement();
            final String value = bundle.getString(key);
            prop.put(key, value);
        }
1
Karthik Prasad

Я считаю, что при запуске из Eclipse, если вы используете "myconf.properties" / как относительный путь, структура вашего файла должна выглядеть примерно так

ProjectRoot
         src
         bin
         myconf.properties

Eclipse будет искать файл в корневом каталоге проекта, если в пути к файлу не указаны другие каталоги.

0
Paul Samsotha

Использование ClassLoader.getSystemClassLoader()

Образец кода :

Properties prop = new Properties();
InputStream input = null;
try {
    input = ClassLoader.getSystemClassLoader().getResourceAsStream("conf.properties");
    prop.load(input);

} catch (IOException io) {
    io.printStackTrace();
}
0
Deep Nirmal