Використання профілів в Maven

У maven можна змінити налаштування проекту в залежності від оточення, ця фіча реалізована через профілі проекту. Профіль містить у собі настройки, які будуть додані до основних налаштувань, або, навпаки, замінять їх.

...
. 
. 
. test
. ...
. ...
. ...
. ...
. ...
. ...
. ...
. ...
. ...
.
.

Профіль можна активувати (включити) явною. Для цього потрібно вказати ім'я профілю разом з прапором-P в рядку запуску maven:

mvn-Pімя_профіля

*-P і ім'я профілю пишуться разом

Так само можна включити профіль якщо задати умови активації. Профіль буде активовано, якщо виповнилося хоча б одна умова активації. Умовою активації може бути наявність або значення певної змінної оточення, версія JDK, версія або тип операційної системи, наявність або відсутність певного файлу і т.п.

. ...
. 
. 
. test
. 
. false
. 1.5
. 
. Windows XP
. Windows
. x86
. 5.1.2600
.
. 
. mavenVersion
. 2.0.3
.
. 
. $ {basedir}/file2.properties
. $ {basedir}/file1.properties
.
.
. ...
.
.

Приклад

Наприклад, у проекті є агрегують модуль з модулем інтеграційних тестів і модулем selenium тестів, а вам не хочеться, щоб тести запускалися на машинах розробників під час виконання рутинної операції "компіляція - юніт-тести - упаковка" mvn clean install.

Це побажання можна реалізувати за допомогою мейвеновскіх профілів.

Початковий pom.xml для агрегують модуля виглядає приблизно так:

. 4.0.0
. habr
. aggr
. 1.0.0-SNAPSHOT
. pom
. Profiles Demo - Top
. 
. module1
. integration-tests
. selenium-tests
.
.

Результат запуску mvn clean install:

----------------------------------------------- -------------------------
Profiles Demo - Module1 ............................... SUCCESS [1.859s]
Profiles Demo - Integration Tests ..................... SUCCESS [0.265s]
Profiles Demo - Selenium Tests ........................ SUCCESS [0.250s]
Profiles Demo - Top ................................... SUCCESS [1.172s]
-------------------------------------------------- ----------------------

Виділяємо інтеграційні тести в окремий профіль з ім'ям it:

. 4.0.0
. habr
. aggr
. 1.0.0-SNAPSHOT
. pom
. Profiles Demo - Top
.
. 
. module1
. selenium-tests
.
.
. 
. 
. it
. 
. integration-tests
.
.
.

Запускаємо mvn clean install

----------------------------------------------- -------------------------
Reactor Summary:
-------------------------------------------------- ----------------------
Profiles Demo - Module1 ............................... SUCCESS [1.828s]
Profiles Demo - Selenium Tests ........................ SUCCESS [0.282s]
Profiles Demo - Top ................................... SUCCESS [1.219s]
-------------------------------------------------- ----------------------

Як бачимо, інтеграційні тести не були включені в процес складання. Щоб включити інтеграційні тести треба вказати ім'я профілю it.

mvn clean install-Pit
----------------------------------------------- -------------------------
Profiles Demo - Module1 ............................... SUCCESS [1.875s]
Profiles Demo - Selenium Tests ........................ SUCCESS [0.266s]
Profiles Demo - Integration Tests ..................... SUCCESS [0.266s]
Profiles Demo - Top ................................... SUCCESS [1.156s]
-------------------------------------------------- ----------------------

От чорт, інтеграційні тести знову з нами.

При вказівці профілю it, Мейв додав (саме додав, а не замістив всю конфігурацію проекту) модуль integration-tests в збірку. Аналогічно можна зробити і з модулем Selenium тестів.

. 4.0.0
. habr
. aggr
. 1.0.0-SNAPSHOT
. pom
. Profiles Demo - Top
.
. 
. module1
.
. 
. 
. it
. 
. integration-tests
.
.
. 
. selenium
. 
. selenium-tests
.
.
.
.

Зібрати всі разом можна вказавши обидва профілю mvn clean install-Pit-Pselenium:

----------------------------------------------- -------------------------
Profiles Demo - Module1 ............................... SUCCESS [1.812s]
Profiles Demo - Integration Tests ..................... SUCCESS [0.312s]
Profiles Demo - Selenium Tests ........................ SUCCESS [0.250s]
Profiles Demo - Top ................................... SUCCESS [1.141s]
-------------------------------------------------- ----------------------

А тепер навпаки

Зробимо зворотний фінт вухами. У моєму проекті один з модулів витягує з репозиторію сервер додатків, запакований у вигляді zip файлу, розпаковує його в певну папку, витягує артефакти проекту і закидає їх у папку сервера програми, генерує батники та конфіги для запуску всіх цих булочок і т.п.

Потрібно щоб на машинах розробників цей модуль запускався без будь-якої магії, а на білд сервері, під час деплоя снепшот, навпаки не запускався.

Початковий pom.xml виглядає так:

. 4.0.0
. habr
. aggr
. 1.0.0-SNAPSHOT
. pom
. Profiles Demo - Top
.
. 
. module1
. create-server
.
.
----------------------------------------------- -------------------------
Profiles Demo - Module1 ............................... SUCCESS [1.875s]
Profiles Demo - Create Server ......................... SUCCESS [0.203s]
Profiles Demo - Top ................................... SUCCESS [1.250s]
-------------------------------------------------- ----------------------

Міняємо pom.xml, переселяємо всі модулі в профіль за замовчуванням default, додаємо в конфігурацію профілю секцію .... А для сценарію, коли не потрібно робити збірку з сервером додатків, створюємо профіль noserver, де вказані всі модулі, крім сервера додатків.

. 4.0.0
. habr
. aggr
. 1.0.0-SNAPSHOT
. pom
. Profiles Demo - Top
.
. 
.
. 
. default
. 
. true
.
. 
. module1
. create-server
.
.
.
. 
. noserver
. 
. module1
.
.
.
.

Запускаємо mvn clean install (сценарій на машині розробника):

----------------------------------------------- -------------------------
Profiles Demo - Module1 ............................... SUCCESS [1.891s]
Profiles Demo - Create Server ......................... SUCCESS [0.266s]
Profiles Demo - Top ................................... SUCCESS [1.188s]
-------------------------------------------------- ----------------------

Зібралися всі модулі разом із сервером додатків.

А тепер запускаємо maven з профілем noserver (сценарій для білд сервера):

mvn clean install-Pnoserver:
----------------------------------------------- -------------------------
Profiles Demo - Module1 ............................... SUCCESS [1.734s]
Profiles Demo - Top ................................... SUCCESS [1.234s]
-------------------------------------------------- ----------------------

Як бачимо, модуль сервера не бере участь в складанні.

Кінцівка

Аналогічно можна управляти залежностями, плагінами, репозиторіями і т.п. Наприклад, для MacOS можна робити збірку з однією версією графічної бібліотеки, а на Win з іншого.

Щоб не використовувати імена профілів, можна на білд сервері встановити глобальну змінну оточення, при наявності якої буде активуватися той чи інший профіль.

Посилання

maven.apache.org/... m.html # Profiles

Опубліковано: 08/06/11 @ 07:31
Розділ Різне

Рекомендуємо:

Як не потрібно рекламувати себе
Яндекс.Субботнік з розробки інтерфейсів в Києві, 28 травня
Яндекс.Субботнік з розробки інтерфейсів в Києві, 28 травня
Конкатенація для пошукової оптимізації великих сайтів
Конкатенація для пошукової оптимізації великих сайтів