Чтение файла свойств из включенного jar

#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>