Apache Maven – фреймворк для автоматизации сборки проектов, специфицированных на XML-языке POM (англ. Project Object Model).
Слово Maven происходит из языка Идиш и означает примерно «собиратель знания».
Apache Maven, в отличие от другого сборщика проектов Apache Ant, обеспечивает декларативную, а не императивную сборку проекта. То есть, в файлах проекта pom.xml содержится его декларативное описание, а не отдельные команды. Все задачи по обработке файлов Apache Maven выполняет через плагины.
Информация для программного проекта, поддерживаемого Apache Maven, содержится в XML-файле с именем pom.xml (от Project Object Model). При исполнении Apache Maven проверяет прежде всего, содержит ли этот файл все необходимые данные и все ли данные синтаксически правильно записаны.
Конфигурация включает имя проекта, его собственника и его зависимости от других проектов. Возможно, также, конфигурировать индивидуальные фазы процесса построения проекта (Build Process), реализованные плагинами. Например, можно конфигурировать плагин компилятора так, что он будет использовать определённую версию Java, или специфицировать упаковку проекта даже в случае негативного результата прохождения некоторых тестов.
Крупные проекты должны быть поделены на несколько модулей, или подпроектов, каждый со своим собственным POM. Можно написать затем корневой POM, через который все модули компилируются единой командой. POM-ы могут наследовать конфигурацию от других POM-ов. Все POM-ы наследуют от Супер POM-а по умолчанию. Супер POM обеспечивает конфигурацию по умолчанию, такую, как структуру каталогов по умолчанию, используемые по умолчанию плагины, и т. п..
Apache Maven поддерживает принцип «соглашения прежде конфигурации» (Convention over Configuration). Поскольку проект придерживается избранной системы соглашений, постольку отпадает необходимость специфицировать их, что сильно упрощает pom.xml. Однако, почти все стандарты, на которые опирается Apache Maven, могут быть изменены индивидуальной конфигурацией.
Стандартная структура каталогов Apache Maven
Поскольку проект её придерживается – отпадает необходимость специфицировать пути к файлам, что сильно упрощает pom.xml.
Корневой каталог проекта: файл pom.xml и все дальнейшие подкаталоги
src: все исходные файлы
src/main: исходные файлы собственно для продукта
src/main/java: Java-исходный текст
src/main/resources: другие файлы, которые используются при компиляции или исполнении, например Properties-файлы
src/test: исходные файлы, необходимые для организации автоматического тестирования
src/test/java: JUnit-тест-задания для автоматического тестирования
target: все создаваемые в процессе работы Apache Maven файлы
target/classes: компилированные Java-классы
Стандартный набор плагинов Apache Maven
Большая часть функциональности Apache Maven осуществляется плагинами. Плагин обеспечивает достижение ряда целей с помощью следующего синтаксиса:
mvn [имя плагина]:[имя цели]
Например, Java-проект может быть скомпилирован плагином-компилятором путем выполнения команды:
mvn compiler:compile
Существуют плагины Apache Maven для построения, тестирования, контроля исходного текста, запуска веб-сервера, генерации Eclipse-проектных файлов и множество других. Плагины перечисляются и конфигурируются в <plugins>-секции файла pom.xml. Некоторая базовая группа плагинов включается в каждый проект по умолчанию. Они имеют гибкую конфигурацию по умолчанию.
Однако, было бы слишком громоздко вручную описывать построение, тестирование и упаковку проекта:
mvn compiler:compile
mvn surefire:test
mvn jar:jar
Концепция жизненного цикла проекта решает эту задачу более удобно.
Стандартный жизненный цикл Apache Maven
Жизненный цикл проекта – это список поименованных фаз, определяющий порядок действий при его построении. Apache Maven использует по умолчанию следующий жизненный цикл:
На этой фазе разрешаются и, при необходимости, скачиваются из интернета зависимости.
(Например – скачивается из интернета JUnit-пакет).
(Тестирующие классы не передаются конечным пользователям.)
Обычно речь идёт о создании JAR- или WAR-файла.
Теперь он доступен как модуль для других локальных проектов.
Теперь стабильная версия проекта доступна широкому кругу разработчиков.
Apache Maven имеет также стандартный жизненный цикл для чистки (Cleaning) и для генерации его страницы (Site). Если бы “Clean” было частью обычного жизненного цикла, проект подвергался бы чистке при каждом построении, что нежелательно.
Стандартные жизненные циклы могут быть существенно дополнены плагинами и архетипами Apache Maven. Плагины Apache Maven позволяют вставлять в стандартный цикл новые шаги (например, распределение на сервер приложений) или расширять существующие шаги. Архетипы Apache Maven представляют собой заготовки для различнейших программных пакетов (если они отвечают стандартам структуры Apache Maven).
Если структура проекта соответствует стандартам Apache Maven, то команда:
mvn package
откомпилирует все Java-файлы, запустит предусмотренные тесты, и упакует поставляемый программный код и ресурсы в target/my-app-1.0.jar (в предположении, что artifactId было определено как ‘my-app’ и версия – как 1.0.)
Используя собственно Apache Maven, пользователь обеспечивает только конфигурацию своего проекта, так как реальную работу по компиляции проекта, чистке целевых каталогов, выполнению элементных тестов, генерации API-документов и т. д. выполняют конфигурируемые плагины. В общем случае, пользователь не должен сам писать плагины. Сравните это с Apache Ant и make, где для выполнения указанных задач пишутся императивные процедуры.
Поддерживаемые IDE Apache Maven
Для самых распространённых интегрированных сред разработки (IDE) имеются плагины, позволяющие удобно управлять Maven-ом. Их список включает:
Eclipse Classic
IntelliJ IDEA
NetBeans IDE
JBuilder
Oracle JDeveloper (version 11.1.2)
MyEclipse
GNU Emacs
Эти плагины обеспечивают также возможность удобно редактировать POM или использовать POM для полного описания зависимостей проекта для нужд используемого IDE.
Apache Maven базируется на плагин-архитектуре, которая позволяет применять плагины для различных задач (Compile, Test, Build, Deploy, Checkstyle, PMD, SCP Transfer) для данного проекта, без необходимости их в явном виде инсталлировать. Это возможно потому, что информация поступает плагину через стандартный вход, а результаты пишутся в его стандартный выход. Теоретически, это позволяет кому угодно писать плагины для взаимодействия со средствами построения проекта (компиляторы, средства тестирования, и т. п.) для любого другого языка. В реальности, поддержка других языков кроме Java сейчас минимальна. Существует плагин для Microsoft .NET Framework, а также плагины для C/C++ Maven Native и Maven NAR.
Количество плагинов стало сейчас очень впечатляющим: от плагинов, позволяющих прямо из Apache Maven стартовать веб-приложение, чтобы тестировать его в браузере, через те, которые позволяют тестировать или создавать банки данных, и до таких, которые генерируют Web Services. Задача разработчика ограничивается нередко только тем, чтобы выявить и применить необходимый плагин.
Ссылки