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

Руководство по профилям Maven

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

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. Профили для конкретных проектов помещаются в файл проекта pom.xml .
  2. Пользовательские профили помещаются в файл settings.xml пользователя.
  3. Глобальные профили помещаются в глобальный файл settings.xml

Обратите внимание, что 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-Tests :

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 .