Мавен изначально создавался , принимая во внимание портируемость. Но довольно часто приложение приходится запускать в разном окружении: например, для разработки используется одна база данных, в рабочем сервере используется другая. при этом могут понадобиться разные настройки, разные зависимости и плагины. Для этих целей в maven используются профайлы.
Давайте определим два профайла: один для разработки, другой для производственного сервера. Для разработки вполне подойдёт база hsqldb, которая хранит все данные в памяти. На производственном сервере же используется база данных postgres, которая сохраняет все данные на диск. В профайлах для каждой конфигурации определены свои проперти database.url и зависимости для разных jdbc драйверов.
Ниже приведён пример объявления таких профайлов.
<?xml version="1.0" encoding="UTF-8"?>
<project>
<profiles>
(1) <profile>
<id>development</id>
<properties>
<database.url>jdbc:hsqldb:mem:testdb</database.url>
</properties>
<dependencies>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</profile>
(2) <profile>
<id>productionServer</id>
<properties>
<database.url>jdbc:postgresql://databseserver/database</database.url>
</properties>
<dependencies>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.0-801.jdbc4</version>
</dependency>
</dependencies>
</profile>
</profiles>
.....
</project>
цифрами 1 и 2 обозначены начала объявления профайлов. каждый профайл имеет идентификатор в данном случае development и productionServer.
Внутри тэга <profile> содержатся все те же объявления что и внутри <project>: properties, dependencies, и др. Вот полный список тегов которые могут содержаться внутри профайлов:
* <repositories>
* <pluginRepositories>
* <dependencies>
* <plugins>
* <properties>
* <modules>
* <reporting>
* <dependencyManagement>
* <distributionManagement>
* <build> тэг, который может содержать
o <defaultGoal>
o <resources>
o <testResources>
o <finalName>
Чтобы содержимое тэга профайла "работало", нужно профайл активировать.
Когда профайл активирован, его содержимое объединяется с основной частью pom.xml.
Нужно заметить, что активных профилей одновременно может быть несколько.
Активировать профайл можно несколькими способами:
во первых, это можно задать вручную в командной строке запуска maven, например: mvn package -P production
Во вторых, при объявлении самого профайла можно задать тэг <activation>, который определяет какой профайл будет активирован: в нашем примере профайл development активный по умолчанию:
<activation><activeByDefault>true</activeByDefault></activation>. Кроме активации по умолчанию можно задать активацию на основе операционной системы, установленных переменных окружения, версии JDK.
В командной строке можно задать, какие профили будут деактивированы: mvn goal -P !profile-1,!profile-2 //приоритет командной строки выше
Активные профайлы можно также задать в ~/.m2/settings.xml
<settings>
...
<profiles>
<profile>
<id>appserverConfig</id>
<properties>
<appserver.home>/path/to/appserver</appserver.home>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>appserverConfig</activeProfile>
</activeProfiles>
...
</settings>Чтобы проверить работу и, возможно, найти ошибки, полезны следующие плагины:
mvn help:active-profiles
mvn help:active-profiles -P productionServer,development
The following profiles are active:
- development (source: pom)
- productionServer (source: pom)mvn help:effective-pom -P productionServer