«1. Обзор

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

В этом уроке мы научимся работать с профилями Maven.

2. Простой пример

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

Сначала мы создадим профиль без тестов, который установит для свойства maven.test.skip значение true:

<profile>
    <id>no-tests</id>
    <properties>
        <maven.test.skip>true</maven.test.skip>
    </properties>
</profile>

Затем мы выполним профиль, запустив команду mvn package -Pno-tests . Теперь артефакт создан и тесты пропущены. В этом случае команда mvn package -Dmaven.test.skip была бы проще.

Однако это было только введение в профили Maven. Рассмотрим более сложные настройки.

3. Объявление профилей

В предыдущем разделе мы видели, как создать один профиль. Мы можем настроить столько профилей, сколько захотим, присвоив им уникальные идентификаторы.

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

Начнем с указания идентификатора для каждого из них в нашем файле pom.xml:

<profiles>
    <profile>
        <id>integration-tests</id>
    </profile>
    <profile>
        <id>mutation-tests</id>
    </profile>
</profiles>

В каждом элементе профиля мы можем настроить множество элементов, таких как зависимости, плагины, ресурсы, finalName.

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

Разделение тестов на профили может ускорить сборку по умолчанию, сосредоточив внимание, скажем, только на модульных тестах.

3.1. Область действия профиля

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

Но в Maven 3 мы можем добавлять профили в любое из трех мест:

  1. Project-specific profiles go into the project’s pom.xml file
  2. User-specific profiles go into the user’s settings.xml file
  3. Global profiles go into the global settings.xml file

Обратите внимание, что Maven 2 поддерживал четвертое расположение, но в Maven 3 это было удалено.

Мы пытаемся настроить профили в pom.xml, когда это возможно. Причина в том, что мы хотим использовать профили как на наших машинах разработки, так и на машинах сборки. Использование файла settings.xml более сложно и чревато ошибками, поскольку нам приходится самим распределять его по средам сборки.

4. Активация профилей

После создания одного или нескольких профилей мы можем начать их использовать или, другими словами, активировать.

4.1. Просмотр активных профилей

Давайте воспользуемся целью help:active-profiles, чтобы увидеть, какие профили активны в нашей сборке по умолчанию:

mvn help:active-profiles

На самом деле, поскольку мы еще ничего не активировали, мы получаем: ~~ ~

The following profiles are active:

Ну ничего.

Мы активируем их через мгновение. Но быстро, еще один способ увидеть, что активировано, — это включить maven-help-plugin в наш pom.xml и связать цель активных профилей с фазой компиляции:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-help-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
                <execution>
                    <id>show-profiles</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>active-profiles</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Теперь давайте приступим к их использованию! Мы рассмотрим несколько разных способов.

4.2. Использование -P

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

Итак, давайте начнем с включения профиля Integration-Test:

mvn package -P integration-tests

Если мы проверим активные профили с помощью maven-help-plugin или команды mvn help:active-profiles -P Integration-tests, мы получим следующий результат:

The following profiles are active:

 - integration-tests

В случае, если мы хотим активировать несколько профилей одновременно, мы используем список профилей, разделенных запятыми:

mvn package -P integration-tests,mutation-tests

4.3. Активен по умолчанию

Если мы всегда хотим выполнять профиль, мы можем сделать его активным по умолчанию:

<profile>
    <id>integration-tests</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
</profile>

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

Однако, если мы запустим команду Maven и включим другой профиль, профиль activeByDefault будет пропущен. Поэтому, когда мы запускаем mvn package -Pmutation-tests, активен только профильmutation-tests.

Когда мы активируем другими способами, профиль activeByDefault также пропускается, как мы увидим в следующих разделах.

4.4. На основе свойства

«Мы можем активировать профили в командной строке. Однако иногда удобнее, если они активируются автоматически. Например, мы можем основывать его на системном свойстве -D:

<profile>
    <id>active-on-property-environment</id>
    <activation>
        <property>
            <name>environment</name>
        </property>
    </activation>
</profile>

Теперь мы активируем профиль с помощью команды mvn package -Denvironment.

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

<property>
    <name>!environment</name>
</property>

Или мы можем активировать профиль, если свойство имеет определенное значение:

<property>
    <name>environment</name>
    <value>test</value>
</property>

Теперь мы можем запустить профиль с Пакет mvn -Denvironment=test.

Наконец, мы можем активировать профиль, если свойство имеет значение, отличное от указанного значения:

<property>
    <name>environment</name>
    <value>!test</value>
</property>

4.5. На основе версии JDK

Другой вариант — включить профиль на основе JDK, работающего на машине. В этом случае мы хотим включить профиль, если версия JDK начинается с 11:

<profile>
    <id>active-on-jdk-11</id>
    <activation>
        <jdk>11</jdk>
    </activation>
</profile>

Мы также можем использовать диапазоны для версии JDK, как описано в синтаксисе диапазона версий Maven.

4.6. На основе операционной системы

Кроме того, мы можем активировать профиль на основе некоторой информации об операционной системе.

И если мы не уверены в этом, мы можем сначала использовать команду mvn Enforcer:display-info, которая дает следующий вывод на моей машине:

Maven Version: 3.5.4
JDK Version: 11.0.2 normalized as: 11.0.2
OS Info: Arch: amd64 Family: windows Name: windows 10 Version: 10.0

После этого мы можем настроить профиль, который активировано только в Windows 10:

<profile>
    <id>active-on-windows-10</id>
    <activation>
        <os>
            <name>windows 10</name>
            <family>Windows</family>
            <arch>amd64</arch>
            <version>10.0</version>
        </os>
    </activation>
</profile>

4.7. На основе файла

Другой вариант — запустить профиль, если файл существует или отсутствует.

Итак, давайте создадим тестовый профиль, который выполняется только в том случае, если testreport.html еще не представлен:

<activation>
    <file>
        <missing>target/testreport.html</missing>
    </file>
</activation>

5. Деактивация профиля

Мы видели много способов активировать профили, но иногда нужно отключить один, а также.

Чтобы отключить профиль, мы можем использовать ‘~!’ или ‘-‘.

Итак, чтобы отключить профиль active-on-jdk-11, мы выполняем команду mvn compile -P -active-on-jdk-11.

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

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

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

Не стесняйтесь взглянуть на готовый файл pom.xml на GitHub.