«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, в наши свойства:

[email protected]@
[email protected]@

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

    **/application*.yml * */application*.yaml **/application*.properties

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

В отсутствие родителя spring-boot-starter-parent нам нужно настроить эту фильтрацию и расширение вручную. Нам нужно включить элемент resources в раздел \u003cbuild\u003e нашего файла 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>     

И в \u003cplugins\u003e:

<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. Gradle

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

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

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

processResources {
    expand(project.properties)
}

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

  1. Does not support properties with dots (e.g. user.name). Gradle understands dots as object property delimiters
  2. Filters all the resource files and not just a specific set of configuration files
  3. Uses the default dollar-sign placeholders ${…} thus conflicting with the standard Spring placeholders

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

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

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])
            }
        }
    }
}

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

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

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

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

«