Ускоряем сборку Maven проекта

Возможно, что программы на Java и работают гораздо медленнее программ на C++, а также, возможно, они потребляют больше памяти, но зато компилятор Java очень быстр по сравнению с компилятором C++.

К сожалению, в современных коммерческих проектах есть ещё много других этапов сборки кроме компиляции. Сборка больших Maven проектов может состоять из огромного количества этапов: скачивание зависимостей, компиляция, тесты, обработка и копирование ресурсов, упаковка в jar, war или ear и ещё много чего, что в конечном итоге приводит к большим временным затратам на получение собранного дистрибутива.

В этой статье я попытаюсь рассказать вам, каким образом вы можете ускорить сборку Maven проекта.

Допустим, у вам есть проект. Сборка в самом простейшем случае выполняется командой:

Эта наиболее часто используемая команда для сборки, и она прекрасно работает. В моём случае выполнение этой команды занимает 55 секунд.

Мы можем заставить Maven использовать несколько потоков. Есть такая экспериментальная опция -T.

Указываем мавен использовать по два потока на каждое ядро процессора:

В итоге сборка того же проекта заняла 36 секунд.

По три потока на каждое ядро процессора:

Сборка заняла 35 секунд. Разницы почти никакой. Можно списать на погрешность.

По четыре потока на каждое ядро процессора:

Сборка заняла 34 секунды. Тоже почти столько же.

Все эти тесты запускались на 4-х ядерном Intel® Core™ i5-4460 CPU @ 3.20GHz. Видимо, 8-и потоков, которые были в случае с двумя потоками на каждое ядро, уже было более чем достаточно.

Следующим этапом ускорения мы можем убрать clean.  В большинстве случаев очистка выходного каталоге не нужна, и особых проблем без этой команды не возникнет (но она может пригодиться при сильном рефакторинге).

Сборка заняла 35 секунд. В нашем случае сборка без clean не дала особого прироста производительности.

Следующим этапом мы  можем включить оффлайн режим:

В моём случае сборка так же осталась 35 секунд, но если ваш проект при сборке постоянно всё пытается скачать из интернета, то --offline вполне может помочь.

В моём случае наибольшее увеличение скорости сборки дало включение сборки в несколько потоков. На вашем же проекте вам лучше попытаться поиграться с clean и --offline, а также с количеством потоков на ядро, чтобы подобрать оптимальное сочетание.

Также обратите внимание, что на момент написания этой статьи опция -T  экспериментальна, она поддерживается не всеми плагинами, и, возможно, не всегда поддерживается в должной мере.

Один комментарий к “Ускоряем сборку Maven проекта”

  1. Еще несколько вариантов(только для случаев сборки для локального тестирования):
    1. Если проект многомодульный а изменения были только в некоторых модулях — то можно с помощью опции -pl пересобрать только измененные модули + общий, который собирает итоговую jar/war/kar
    2. Классическое отключение тестов -Dmaven.test.skip
    3. Здесь(https://habrahabr.ru/post/304164/) еще советуют -am, но как-то не приходилось пользоваться

    По ощущениям offline почти ничего не дает. Мавен идет в интернет только когда видит, что локальный репозиторий давно не обновлялся или еще по каким-то причинам. Если подряд несколько раз перезапускать сборку, то в интернет в последующие разы он лезть не должен.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *