Что Maven 3 нам готовит?

Очень уважаю эту систему сборки за ее гибкость, совмещенную с простотой.
И вот 8 октября 2010 года свершилось великое событие — вышла ее третья версия.
Правда из Release Notes на сайте Maven мне так и не удалось определить полный набор возможностей, введенных в новой версии, потому я установил себе новую версию, запустил браузер и принялся исследовать. Ниже прилагается список найденных мной опытным или гугловым путем нововведений.

Не смотря на множество публикаций никакой поддержки не XML конфигураций в ядре Maven я так и обнаружил. Зато, как выяснилось, разработчики переписали ModelReader, что должно значительно упростить разработку плагинов, поддерживающих дополнительные языки для pom файлов.
Собственно разработкой проекта поддержки дополнительных конфигурационных языков для Maven занимается корпорация Sonatype в своем проекте Polyglot Maven. На сайте проекта мне удалось обнаружить целый один дистрибутив версии 0.8-SNAPSHOT, который по сути является хакнутой версией самого Maven :)

Параллельная сборка. Вот она действительно работает и действительно включена в новую версию. Maven научился запускать несколько потоков, параллельно осуществляющих сборку независимых модулей приложения.
Чтобы запустить сборку в несколько потоков, необходимо добавить к командной строке параметр -T. Так, например, следующая команда запустит сборку в три потока:
mvn -T 3 clean install
Более того, можно указать, сколько вы хотите создать потоков на одно ядро процессора, например, следующая команда запустит по два потока на ядро:
mvn -T 2C clean install
Единственная заковыка состоит в том, что плагины, используемые при сборке, должны такую многопоточность поддерживать (быть аннотированными @threadSafe), а иначе возможны неожиданные сюрпризы. Maven предупредит об этом и честно продолжит сборку.

Поддержка аннотаций для плагинов. Полезно только для разработчиков этих самых плагинов — часть конфигурации из plugin.xml была перенесена в аннотации.

Embedding. Фитча, реализованная в основном для IDE и разнообразных хаков — позволяет интегрировать ядро Maven в приложение. Для этой цели в Maven был заменен IoC контейнер: Plexus умер, да здравствует Google Guice. Собственно Polyglot Maven работает именно на механизме встраивания Maven в себя.

Изменения в жизненном цикле.
Теперь плагины могут добавлять собственные фазы в жизненный цикл сборки, поэкспериментировать как следует, к сожалению, не удалось.
Кроме того, сторонние системы получили возможность регистрироваться слушателями на события жизненного цикла и получать уведомления о них.
Сам жизненный цикл был поделен на три фазы: подготовительный жизненный цикл, собственно жизненный цикл сборки и жизненный цикл окончания сборки. Все опять же во имя встраивания.

Улучшена поддержка OSGi. Опробовать не удалось, однако, из найденных источников следует, что благодаря двум предыдущим нововведениям Maven научился стартовать внутри себя Equinox, через Tycho-плагин и буквально передавать тому управление всеми зависимостями при сборке проекта. Звучит достаточно круто. Учитывая, что меня давно мучил вопрос о совместимости Maven и OSGi.

Был полностью переписан клиент для Maven репозиториев, теперь он модно называется Mercury и полностью поддерживает SSL и WebDAV.

Улучшение производительности. Разработчики Maven обещали прирост в 50-400%. Однако, проведя небольшое сравнение сборок одного и того же проекта обоими версиями Maven, большого прироста производительности я не ощутил. А скорее стало даже медленнее: время сборки тестового проекта увеличилось на 11 секунд, с 5:43 до 5:54. Включение многопоточной сборки (по потоку на каждое из 2 ядер) улучшило результат, но не на много — сборка прошла за 5:20.

Изменился консольный вывод и валидация pom.xml — они стали более разговорчивы. Теперь Maven по умолчанию уведомляет о том, что не была явно указана версия плагина, хотя знает откуда ее скачать. Фитча сомнительной полезности.

Больше не поддерживается бывший deprecated еще с Maven 2 файл profiles.xml. Сам им честно не разу не пользовался.

Наконец появилось вменяемое правило использования версий плагинов. Теперь вместо LATEST (который свободно может быть SNAPSHOT) берется RELEASE версия.

Последняя фича пожалуй моя любимая. Теперь Maven не просто выкидывает сообщение об ошибке при падении сборки, но еще и выдает ссылку на wiki, где можно ознакомится с деталями проблемы. Очень полезно для тех, кого забанили в гугле.

Из неожиданностей могу добавить тот факт, что директорией локального репозитория по умолчанию почему-то осталась ~/.m2/repository :) Просмотрели видать.

В общем впечатление от нового релиза двоякое: с одной стороны он обещал принести больше всего изменений со времен Maven 2.0 и в принципе принес, но с другой — большинство из этих изменений носят чисто косметический или технический характер и действительно необходимы лишь любителям "покопаться в кишках".


Дабы не быть плагиатчиком прилагаю список некоторых дополнительных источников, ссылки на которые не приведены в заметке: