2016-12-31 1 views
0

Я пытаюсь прочитать файл свойств в проекте природы maven, используя Properties.load(); Я задаю путь как строку ex. "./someFolder/file.properties", , но когда я пытаюсь использовать свой проект как зависимость в других проектах, я вынужден копировать эти файлы в другой проект, просто потому, что "." означает текущий каталог. Есть ли способ указать путь, чтобы он всегда был действительным, несмотря на то, где я его вызываю? , Я попытался использовать MyClass.class.getClassLoader().getResourceAsStream(), но у меня возникли проблемы с его использованием, он работал иногда и не срабатывал в другое время.Каков наилучший способ указать путь для чтения из класса, даже если проект был jar

ответ

1

В вашем вопросе есть много неправильных представлений.

"." означает Classpath

No. При использовании внутри файловой системы пути (т.е. путь, передаваемый конструктору файла или FileReader или FileInputStream), «» означает текущий каталог.

При использовании в ресурсе ресурс путь (т. Е. Принят к Class[Loader].getResource[AsStream]()), он недействителен.

Трюк состоит в том, чтобы внимательно ознакомиться с документацией.

getResourceAsStream() ожидает / -расширенная дорожка.

При использовании ClassLoader.getResource[AsStream]() этот путь всегда начинается с корня пути к классам. Таким образом, вы пройдете путь, похожий на полное имя класса, за исключением того, что точки будут заменены косой чертой. Итак, com/foo/bar.properties ищет ресурс с именем bar.properties, в пакете com.foo.

При использовании SomeClass.class.getResource[AsStream](), путь начинается с /, и путь начинается с корня пути к классам или нет, и он начинается с пакета SomeClass. Итак, если SomeClass находится в пакете com.foo, использование /com/foo/bar.properties эквивалентно использованию bar.properties.

Трудно сказать, что вы делаете неправильно, поскольку вы не предоставляете никаких подробностей. Но вам действительно нужно понять разницу между открытием файла в файловой системе и чтением ресурса, загруженного загрузчиком классов. Иногда ресурсы просто загружаются загрузчиком классов из файловой системы, потому что путь к классам содержит каталоги, а не только файлы jar.

+0

Спасибо за исправление, да Это означает, что текущий путь не путь класса – SaleemKhair

0

Я заметил, что моя проблема заключалась в том, что у меня были файлы свойств в самом пути к проекту, и что ClassLoader.getResource[AsStream](); выглядит как папка target/classes и что у меня не было папки ресурсов в моем проекте.

Я решил его добавить папку ресурсов в мой путь сборки и добавить мои файлы в src/main/resources следующим образом: src/main/resources/foo/bar.properties и загрузить его SomeClass.class.getClassLoader().loadResourceAsStream("foo/bar.properties");.

Смежные вопросы