Ускоряем процесс сборки с maven

в 11:22, , рубрики: java, maven 3, метки:

Наверное многие из Вас работают с Maven. Если так, то полагаю каждый из Вас ежедневно собирает свой проект по несколько раз, особенно если Вы сейчас в активной фазе разработки и изменения затрагивают много модулей. В определенный момент времени проект становится довольно большим и билд с каждым днем начинает выполнятся все дольше и дольше… И вот приходит время, когда пора что-то с этим делать.

Мигрируйте с Maven 2 на Maven 3

Вы еще используете maven2? Странно. Одна только миграция на 3-ю версию может значительно ускорить процесс сборки. В моем проекте переход на Maven 3 дал прирост в скорости сборки на 10%. Вероятней всего за счет каких-то фиксов и оптимизаций, что были сделаны в новой версии (так как заявляют разработчики количество кода было существенно уменьшено и сильно отрефакторено). Миграция займет у Вас несколько минут и в большинстве случаев будет безболезненной. Хотя есть шанс, что некоторые конфигурационные файлы все же придется подправить.

Используем ядра и дополнительные потоки

В Maven 3 есть замечательная опция:

mvn -T 4 clean intall
mvn -T 2C clean install

В первом случае мы явно указываем, что хотим запустить процесс сборки на 4 потока. Во втором случае мы указываем, что на каждое ядро должно быть выделено по 2 потока для процесса сборки. Это одна из новых фич нового мавена — Parallel Builds. Эта фича анализирует граф зависимостей Вашего проекта
и распихивает модули по разным потокам, сборка которых может быть выполнена параллельно.
Для моего текущего проекта скорость сборки со вторым параметром (-T 2C) ускорилась на 20%. Правда тут есть один минус. Количество ресурсов, что будет потребляться для билда может значительно вырасти. В моем случае это +30% к потребляемой памяти.
Хочу сразу обратить внимание — если связанность модулей в Вашем проекте очень низкая — то
скорость сборки этой опцией можно увеличить на порядок.
Это, кстати, повод задуматься об Вашей архитектуре проекта. Ведь если билд занимает довольно много времени, то небольшой рефакторинг поможет уменьшить эту цифру. Хотя, конечно, это все очень индивидуально.
Вообще разработчики заявляют, что прирост в скорости сборки может быть 20-50%.

Разделяй и властвуй

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

mvnsh

Maven Shell — по сути, просто активная командная строка maven. Вся фишка в том, что она висит постоянно в памяти, следовательно при каждом новом билде нету необходимости запускать по новой JVM. В дополнение кешируются все конфигурационные файлы и все плагины уже предварительно загружены. Подробней прочитать можно тут и тут.

Плагины

Убедитесь, что Вы не используете лишние плагины и не используете дополнительные там, где можно обойтись без них. Мавен — это целая эко-система, поэтому важно понимать, что каждый элемент этой системы влияет на производительность в целом.
Стоит также упомянуть, что во время билда с параметром "-T" Вы можете обнаружить подобное в логе выполнения:

[WARNING] *****************************************************************
[WARNING] * Your build is requesting parallel execution, but project      *
[WARNING] * contains the following plugin(s) that are not marked as       *
[WARNING] * @threadSafe to support parallel building.                     *
[WARNING] * While this /may/ work fine, please look for plugin updates    *
[WARNING] * and/or request plugins be made thread-safe.                   *
[WARNING] * If reporting an issue, report it against the plugin in        *
[WARNING] * question, not against maven-core                              *
[WARNING] *****************************************************************
[WARNING] The following plugins are not marked @threadSafe in eridanus-supervoid-module:
[WARNING] org.codehaus.mojo:jboss-maven-plugin:1.5.0

Поэтому, собственно, желательно использовать последние версии плагинов, потому что они с большой вероятностью могут быть уже thread-safe. Как Вы понимаете — если плагин не thread-safe, то все его задачи, не могут быть распределены между потоками при опции "-T".

Буду благодарен за любую дополнительную информацию, которая поможет ускорить сборку.

Автор: doom369

Поделиться

* - обязательные к заполнению поля