#java #spring #maven #module
#java #весна #maven #модуль
Вопрос:
Я пытаюсь создать анализатор аннотаций, который считывает файл свойств. Структура выглядит следующим образом:
- annotationParserModule
- declaration of interace
- annotationParser
теперь мое приложение имеет структуру, подобную этой:
- main
- java
- resources
- .properties file
Я включаю annotationParserModule через maven, поэтому, если я не ошибаюсь, в моем проекте включен jar fire.
Однако мне нужно прочитать файл свойств за пределами jar, предоставленного annotationParserModule
, возможно ли что-то подобное? Если да, то каков правильный способ добиться этого?
Спасибо за помощь.
Ответ №1:
Если ресурс, который вы хотите прочитать, включен в путь к классу вашего приложения (например, внутри jar, в WEB-INF/lib
папке, папке, переданной с -cp
java
помощью команды to и т. Д.) вы можете прочитать файл, используя метод getResourceAsStream Class
класса.
Предоставление примера для вашего случая, имеющего такие папки, как:
- main
- java
- resources
- yourconfig.properties
В вашем YourAnnotationParser
коде вы можете иметь:
InputStream is = this.getClass().getClassLoader().getResourceAsStream("yourconfig.properties");
Если файл вложен:
- main
- java
- resources
- iamafolder
- yourconfig.properties
Итак:
InputStream is = this.getClass().getClassLoader().getResourceAsStream("iamafolder/yourconfig.properties");
Кстати, это очень упрощенный ответ, код работает по общему сценарию, то, что он делает за кулисами, сложнее, чем «чтение файла вне jar», но чтобы полностью понять это, вам нужно посмотреть, как работает загрузчик классов Java и путь к классам.
Если файл находится за пределами пути к классу java, вы можете использовать File
класс или URL
класс для чтения содержимого.
Комментарии:
1. В моем проекте нет папки WEB-INF / lib, или вы имели в виду, что я просто должен хранить его внутри пакета ресурсов? Я использую spring-boot. Использование этого внутри моего процессора вызвало исключение nullpointer: слова входного потока = this.getClass().getResourceAsStream(имя «.properties»); Пакет PropertyResourceBundle = новый пакет PropertyResourceBundle(новый InputStreamReader (слова));
2. также при использовании FIle мне пришлось бы указать абсолютный путь, нет?
3. использование
File
вы также можете использовать относительный путь, но это очень не рекомендуется, поскольку он является относительным по отношению к пути, по которомуjava
выполняется команда… ДляgetResourceAsStream
этого все должно быть в порядке,resource
папка является частью пути к классу. КСТАТИ, spring boot выполняет какой-то волшебный трюк, когда упаковывает артефакт, можете ли вы попробовать использовать тот же фрагмент кода в том же проекте, гдеproperties
находится файл, чтобы проверить, работает ли он?4. ах, там тоже null, странно
5. я использовал этот.getClass().getClassLoader().getResourceAsStream(имя «.properties»); и он начал работать 🙂
Ответ №2:
В вас applicationcontext.xml вы можете добавить компонент для чтения файла свойств из jar
<bean id="com.mybean"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:/resource.properties</value>
</list>
</property>
</bean>
и этот идентификатор будет ссылкой на другой компонент
<bean id="com.mybean1">
class="com.dependent.jar.classname">
<property name="properties" ref="com.mybean" />
</bean>