Возможно, что программы на Java и работают гораздо медленнее программ на C++, а также, возможно, они потребляют больше памяти, но зато компилятор Java очень быстр по сравнению с компилятором C++.
К сожалению, в современных коммерческих проектах есть ещё много других этапов сборки кроме компиляции. Сборка больших Maven проектов может состоять из огромного количества этапов: скачивание зависимостей, компиляция, тесты, обработка и копирование ресурсов, упаковка в jar, war или ear и ещё много чего, что в конечном итоге приводит к большим временным затратам на получение собранного дистрибутива.
В этой статье я попытаюсь рассказать вам, каким образом вы можете ускорить сборку Maven проекта.
Допустим, у вам есть проект. Сборка в самом простейшем случае выполняется командой:
1 |
mvn clean install |
Эта наиболее часто используемая команда для сборки, и она прекрасно работает. В моём случае выполнение этой команды занимает 55 секунд.
Мы можем заставить Maven использовать несколько потоков. Есть такая экспериментальная опция -T.
Указываем мавен использовать по два потока на каждое ядро процессора:
1 |
mvn -T 2C clean install |
В итоге сборка того же проекта заняла 36 секунд.
По три потока на каждое ядро процессора:
1 |
mvn -T 3C clean install |
Сборка заняла 35 секунд. Разницы почти никакой. Можно списать на погрешность.
По четыре потока на каждое ядро процессора:
1 |
mvn -T 4C clean install |
Сборка заняла 34 секунды. Тоже почти столько же.
Все эти тесты запускались на 4-х ядерном Intel® Core™ i5-4460 CPU @ 3.20GHz. Видимо, 8-и потоков, которые были в случае с двумя потоками на каждое ядро, уже было более чем достаточно.
Следующим этапом ускорения мы можем убрать clean. В большинстве случаев очистка выходного каталоге не нужна, и особых проблем без этой команды не возникнет (но она может пригодиться при сильном рефакторинге).
1 |
mvn -T 2C install |
Сборка заняла 35 секунд. В нашем случае сборка без clean не дала особого прироста производительности.
Следующим этапом мы можем включить оффлайн режим:
1 |
mvn -T 2C --offline install |
В моём случае сборка так же осталась 35 секунд, но если ваш проект при сборке постоянно всё пытается скачать из интернета, то --offline вполне может помочь.
В моём случае наибольшее увеличение скорости сборки дало включение сборки в несколько потоков. На вашем же проекте вам лучше попытаться поиграться с clean и --offline, а также с количеством потоков на ядро, чтобы подобрать оптимальное сочетание.
Также обратите внимание, что на момент написания этой статьи опция -T экспериментальна, она поддерживается не всеми плагинами, и, возможно, не всегда поддерживается в должной мере.
Еще несколько вариантов(только для случаев сборки для локального тестирования):
1. Если проект многомодульный а изменения были только в некоторых модулях — то можно с помощью опции -pl пересобрать только измененные модули + общий, который собирает итоговую jar/war/kar
2. Классическое отключение тестов -Dmaven.test.skip
3. Здесь(https://habrahabr.ru/post/304164/) еще советуют -am, но как-то не приходилось пользоваться
По ощущениям offline почти ничего не дает. Мавен идет в интернет только когда видит, что локальный репозиторий давно не обновлялся или еще по каким-то причинам. Если подряд несколько раз перезапускать сборку, то в интернет в последующие разы он лезть не должен.