2012-04-28

Maven: the complete reference

На работе пеход на Idea принес с собой систему сборки Maven. До этого мои знания ограничивались "ну это типа анта, там тоже XML", "у них в репозитории хранятся все библиотеки, и нет необходимости качать кучу jar библиотек". После переезда захотелось более подробно вникнуть в систему, чтобы в проекте не было хранителей сакральных знаний, и, при необходимости, самому допиливать скрипты.



Первый взгляд на pom файл, абсолютно не проясняет, как из этого конфига получается проект. Беглое введение тоже не дало ответов, пришлось качать книги. К моему сожалению "Complete Reference" писали опытные в запуске холодного синтеза люди. Было совершенно непонятно на какой уровень читателя рассчитана книга. С каждой следующей главой вводились все новые сущности, а ответов на вопросы не появлялось. Над некоторыми абзацами приходилось сидеть минут по десять, раз за разом перечитывая и пытаясь понять, что же хотели сказать авторы.

Самый эпичный перл: у нас есть плагин clean, у него есть цель clean:clean, привязанная к фазе clean, и когда мы запускаем clean из командной строки, запускается clean а не clean:clean. ААААА, что за херня.

Вопросов стало настолько много, что пришлось выписать их на бумажки и лезть на официальный сайт за ответами, после чего стало более менее ясно, по крайней мере, я теперь могу написать pom для простенького проекта.

Тем не менее, какие-то мысли я вынес.
* В Maven есть базовый pom файл, в котором прописана куча умолчательных параметров, а все проектные файлы наследуются от него, что позволяет драматически сократить размер конфигурации и время для понимания стандартного maven-проекта.

* Maven это не альтернатива Ant, а идеология принесенная в структуру проекта, более того, Ant может быть использован в качестве одного из плагинов Maven, для особо сложных случаев. Ант процедурен, а Maven декларативен.

* Идеология Maven это навешивание плагинов на точки расширения в жизненном цикле проекта. Жизненный цикл диктуется типом упаковки артефакта.

* Типы переносимости проектов
- Непереносимый проект: тесно привязан к окружению и перенос его на другую машину связан с большими техническими трудностями по воспроизводству окружения и переписыванию скриптов сборки под себя.
- Переносимый на уровне среды: в проекте вынесена конфигурация среды и новый разработчик должен указать параметры свое среды для запуска
- Переносимый на уровне организации: проект привязан к определенным ресурсам внутри организации, таким как репозитории, субд, службы. Проект может быть переносимым, но до тех пор, пока доступны внутренние ресурсы.
- Глобально переносимый проект: может быть забран из репозитория и собран без конфигурирования в любой среде.

Уровень переносимости не дискретен, и чем более переносимым должен быть проект, тем больше усилий это требует. Maven позволяет задавать профайлы, которые будут активироваться в тех или иных средах. Чем менее переносим проект, тем сложнее в нем добавлять зависимости. А развертывание требует обращения к специальным людям, отвечающим за этот магический процесс. Непереносимые проекты имеют тенденцию появляться в политизированных организациях, когда небольшая группа людей, обладающих сакральным знанием захватывает контроль над тем, как проект собирается и развертывается. "Как нам собрать проект и развернуть систему? Оу, мы должны попросить Джека собрать проект для нас, никто больше не развертывает систему на продакшене. Это очень опасно и гораздо более распространенная ситуация, чем вы можете представить."

* Все сайты проектов, на сервере Apache сгенерированы при помощи Maven.

* Maven построен на Dependency Injection платформе Plexus, которая появилась до Spring.

* В Maven имеются шаблоны и заготовки для большого количества проектов, Archetypes в терминологии Maven

Итог
Великолепным инструмент и ужасная книга