Перейти к основному содержимому

Автоматическое расширение свойств с помощью Spring Boot

· 3 мин. чтения

1. Обзор

В этой статье мы рассмотрим механизм расширения свойств, предоставляемый Spring, с помощью методов сборки Maven и Gradle.

2. Мавен

2.1. Конфигурация по умолчанию

Для проектов Maven, использующих spring-boot-starter-parent , нет необходимости в дополнительных конфигурациях для использования расширений свойств:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
</parent>

Теперь мы можем расширить свойства нашего проекта, используя заполнители @…@ . Вот пример того, как мы можем сохранить версию проекта, взятую из Maven, в наши свойства:

expanded.project.version=@project.version@
expanded.project.property=@custom.property@

Мы можем использовать эти расширения только в файлах конфигурации, соответствующих этим шаблонам:

  • **/приложение*.yml
  • **/приложение*.yaml
  • **/приложение*.Свойства

2.2. Ручная настройка

В отсутствие родителя spring-boot-starter-parent нам нужно будет настроить эту фильтрацию и расширение вручную. Нам нужно включить элемент ресурсов в раздел < build> нашего файла pom.xml :

<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
</resource>
</resources>

И в < plugins> :

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>

В тех случаях, когда требуется использовать стандартные заполнители типа ${variable.name} , нам нужно установить для useDefaultDelimeters значение true , и ваши application.properties будут выглядеть так:

expanded.project.version=${project.version}
expanded.project.property=${custom.property}

3. Грейдл

3.1. Стандартное решение Gradle

Решение Gradle из документации Spring Boot не на 100 % совместимо с фильтрацией и расширением свойств Maven.

Чтобы позволить нам использовать механизм расширения свойств, нам нужно включить следующий код в build.gradle :

processResources {
expand(project.properties)
}

Это ограниченное решение со следующими отличиями от конфигурации Maven по умолчанию:

  1. Не поддерживает свойства с точками (например , user.name). Gradle понимает точки как разделители свойств объекта
  2. Фильтрует все файлы ресурсов, а не только определенный набор файлов конфигурации.
  3. Использует заполнители со знаком доллара по умолчанию ${…} , что противоречит стандартным заполнителям Spring.

3.2. Maven-совместимое решение

Чтобы воспроизвести стандартное решение Maven и использовать заполнители стиля @…@ , нам нужно добавить следующий код в наш build.gradle :

import org.apache.tools.ant.filters.ReplaceTokens
processResources {
with copySpec {
from 'src/main/resources'
include '**/application*.yml'
include '**/application*.yaml'
include '**/application*.properties'
project.properties.findAll().each {
prop ->
if (prop.value != null) {
filter(ReplaceTokens, tokens: [ (prop.key): prop.value])
filter(ReplaceTokens, tokens: [ ('project.' + prop.key): prop.value])
}
}
}
}

Это разрешит все свойства проекта. Мы по-прежнему не можем определять свойства с точками (например, user.name) в build.gradle , но теперь мы можем использовать файл gradle.properties для определения свойств в стандартном формате свойств Java, и он также поддерживает свойства с точками (например, database.url ). ).

Эта сборка фильтрует только файлы конфигурации проекта, а не все ресурсы, и на 100 % совместима с решением Maven.

4. Вывод

В этом кратком руководстве мы увидели, как автоматически расширять свойства Spring Boot, используя методы сборки Maven и Gradle, и как мы можем легко перейти от одного к другому.

Полный пример исходного кода можно найти на GitHub .