Мавен изначально создавался , принимая во внимание портируемость. Но довольно часто приложение приходится запускать в разном окружении: например, для разработки используется одна база данных, в рабочем сервере используется другая. при этом могут понадобиться разные настройки, разные зависимости и плагины. Для этих целей в 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