«1. Обзор

Файлы свойств — это распространенный метод, который мы можем использовать для хранения информации, относящейся к проекту. В идеале мы должны держать его вне упаковки, чтобы иметь возможность вносить изменения в конфигурацию по мере необходимости.

В этом кратком руководстве мы рассмотрим различные способы загрузки файла свойств из места за пределами jar в приложении Spring Boot.

2. Использование местоположения по умолчанию

По соглашению, Spring Boot ищет внешний файл конфигурации — application.properties или application.yml — в 4 предопределенных местоположениях в следующем порядке приоритета:

    Подкаталог /config текущего каталога Текущий каталог Путь к классам /config Пакет Корень пути к классам

Таким образом, будет загружено свойство, определенное в application.properties и помещенное в подкаталог /config текущего каталога. Это также переопределит свойства в других местах в случае столкновения.

3. Использование командной строки

Если приведенное выше соглашение не работает для нас, мы также можем настроить местоположение непосредственно в командной строке:

java -jar app.jar --spring.config.location=file:///Users/home/config/jdbc.properties

Мы также можем передать местоположение папки, в которой приложение будет искать файл:

java -jar app.jar --spring.config.name=application,jdbc --spring.config.location=file:///Users/home/config

Альтернативный подход — запустить приложение Spring Boot через подключаемый модуль Maven. Здесь мы можем использовать параметр -D:

mvn spring-boot:run -Dspring.config.location="file:///Users/home/jdbc.properties"

4. Использование переменных среды

Или, допустим, мы не можем изменить команду запуска. Что замечательно, Spring Boot также будет читать переменные среды SPRING_CONFIG_NAME и SPRING_CONFIG_LOCATION:

export SPRING_CONFIG_NAME=application,jdbc
export SPRING_CONFIG_LOCATION=file:///Users/home/config
java -jar app.jar

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

5. Использование свойств приложения

Как мы видим, свойства spring.config.name и spring.config.location должны быть определены до запуска приложения, поэтому их можно использовать в файле application.properties (или аналог YAML) не будет иметь никакого эффекта.

Spring Boot изменил способ обработки свойств в версии 2.4.0, и вместе с этим изменением команда представила новое свойство, которое позволяет импортировать дополнительные файлы конфигурации непосредственно из свойств приложения:

spring.config.import=file:./additional.properties,optional:file:/Users/home/config/jdbc.properties

6. Программно ~ ~~ Или, если нам нужен программный доступ, мы можем зарегистрировать bean-компонент PropertySourcesPlaceholderConfigurer:

Здесь мы использовали PropertySourcesPlaceholderConfigurer для загрузки свойств из пользовательского местоположения.

public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer properties = 
      new PropertySourcesPlaceholderConfigurer();
    properties.setLocation(new FileSystemResource("/Users/home/conf.properties"));
    properties.setIgnoreResourceNotFound(false);
    return properties;
}

7. Исключение файла из Fat Jar

Плагин Maven Boot автоматически включит все файлы из каталога src/main/resources в пакет jar.

Если мы не хотим, чтобы файл был частью jar, мы можем исключить его с помощью простой конфигурации:

В этом примере мы отфильтровали файл conf.properties из входит в полученную банку.

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>**/conf.properties</exclude>
            </excludes>
        </resource>
    </resources>
</build>

8. Заключение

Как мы видим, среда Spring Boot сама позаботится о внешней конфигурации за нас.

Часто нам просто нужно поместить значения свойств в правильные файлы и места, но мы также можем использовать Java API Spring для большего контроля.

Как всегда, полный исходный код примеров доступен на GitHub.

«