«1. Введение

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

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

2. Информация о сборке

Допустим, мы хотим отобразить описание и версию приложения на домашней странице нашего сайта.

Обычно эта информация присутствует в pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>spring-boot</artifactId>
    <name>spring-boot</name>
    <packaging>war</packaging>
    <description>This is simple boot application for Spring boot actuator test</description>
    <version>0.0.1-SNAPSHOT</version>
...
</project>

3. Ссылка на информацию в файле свойств приложения

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

[email protected]@
[email protected]@

Здесь мы использовали значение свойства сборки project.description для установки свойства приложения application-description. Точно так же версия приложения задается с помощью project.version.

Наиболее важным моментом здесь является использование символа @ вокруг имени свойства. Это говорит Spring расширить именованное свойство из проекта Maven.

Теперь, когда мы собираем наш проект, эти свойства будут заменены их значениями из pom.xml.

Это расширение также называется фильтрацией ресурсов. Стоит отметить, что этот вид фильтрации применяется только к производственной конфигурации. Следовательно, мы не можем использовать свойства сборки в файлах src/test/resources.

Еще одна вещь, которую следует отметить, это то, что если мы используем флаг addResources, цель spring-boot:run добавляет src/main/resources непосредственно в путь к классам. Хотя это полезно для горячей перезагрузки, это позволяет обойти фильтрацию ресурсов и, следовательно, эту функцию.


Теперь приведенное выше расширение свойства работает «из коробки», только если мы используем spring-boot-starter-parent.

3.1. Расширение свойств без spring-boot-starter-parent

Давайте посмотрим, как мы можем включить эту функцию без использования зависимости spring-boot-starter-parent.

Во-первых, мы должны включить фильтрацию ресурсов внутри элемента \u003cbuild/\u003e в нашем pom.xml:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

Здесь мы включили фильтрацию ресурсов только в src/main/resources.

Затем мы можем добавить конфигурацию разделителя для maven-resources-plugin:

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

Обратите внимание, что мы указали для свойства useDefaultDelimiters значение false. Это гарантирует, что стандартные заполнители Spring, такие как ${placeholder}, не будут расширены сборкой.

4. Использование информации о сборке в файлах YAML

Если мы используем YAML для хранения свойств приложения, возможно, мы не сможем использовать @ для указания свойств сборки. Это связано с тем, что @ является зарезервированным символом в YAML.

Но мы можем преодолеть это, настроив другой разделитель в maven-resources-plugin:

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

Или просто переопределив свойство resource.delimiter в блоке свойств нашего pom.xml: ~~ ~

<properties>
    <resource.delimiter>^</resource.delimiter>
</properties>

Затем мы можем использовать ^ в нашем файле YAML:

application-description: ^project.description^
application-version: ^project.version^

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

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

И, конечно же, код, сопровождающий это руководство, можно найти на GitHub.