Почему мой файл в / src / main / resources не читается при исполнении? - PullRequest
2 голосов
/ 30 декабря 2011

У меня есть проект Java и я использовал стандартный архетип maven для создания структуры dir. Это выглядит так:

|-src/main/java 
|-src/main/resources
|-target/classes
|- ... 

Теперь один из моих классов использует файл .properties для чтения в некоторых настройках. Я поместил его в src / main / resources и прочитал его через File propertiesFile = new File("./src/main/resources/starter.properties");.
Когда я использую конфигурацию запуска eclipse, все работает нормально. Но недавно я попытался запустить тот же Java-класс из своей консоли, используя java some.package.Class, и, так как .class-файл находится в target / classes, я получил сообщение, что ./src/main/resources/starter.properties не может не найдено.

Что я делаю неправильно? Файл .properties не должен находиться в папке ресурсов или я должен использовать другой способ для его загрузки?

Ответы [ 4 ]

5 голосов
/ 30 декабря 2011

Два предыдущих ответа верны, но я хотел бы дать немного больше контекста.

Этот файл находится в двух местах.Он начинается в / src / main / resources и при сборке проекта Maven копирует его в /target/classes.

Во время выполнения вы не должны получать доступ к копии, которая находится в вашем исходном коде.В противном случае вашему программному обеспечению потребуется доступ к исходному коду для запуска.Скорее, вы должны получить доступ к копии, которая находится в вашем отчете.Во время выполнения вы можете смело предполагать, что найдете его на пути к классам.Он находится в том же месте, что и ваши скомпилированные классы, поэтому, если бы его не было в пути к классам, вы бы не смогли запустить программу.Вот почему вы должны использовать getResourceAsStream(), как упоминали другие авторы.

(Хотя для производственного программного обеспечения я рекомендую абстракцию ресурсов Spring для доступа к этим вещам.)

4 голосов
/ 30 декабря 2011

использование

YourClass.class.getResourceAsStream("/filename.properties");
3 голосов
/ 30 декабря 2011

Чтобы развернуть два ответа, которые уже были даны, при сборке проекта Maven файлы из src / main / resources копируются в ваш JAR-файл в корне пути к классам.Если вы сделали jar tvf *yourjarname*, вы заметите, что в нем нет ни папки src / main / java, ни src / main / resources.Поэтому попытка вручную прочитать эти (теперь несуществующие) пути потерпит неудачу при запуске через JAR.В двух других ответах есть отличные предложения, используйте метод getResourceAsStream для чтения в вашем файле.Существует даже метод объекта Properties, который делает его очень удобным и простым в использовании:

     URL resourceURL = Thread.currentThread().getContextClassLoader()
           .getResource(yourpropertyfilename);

     Properties props = new Properties();
     props.load(resourceURL.openStream());
2 голосов
/ 30 декабря 2011

Во время выполнения этот файл будет в вашем classpath. Используйте Class.getResourceAsStream() для доступа к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...