Существуют ли инструменты, которые профилируют сам процесс сборки Maven, чтобы я мог видеть, на что сборка тратит больше всего времени?
У нас есть проблемы в работе с Maven 3.0.3 и 3.0 b1. Наш проект строится намного быстрее при 3.0b1 (3m30s) по сравнению с 3.0.3 (9m00s). С 3.0b1 сборка выполняется примерно на 63% быстрее (если моя математика верна).
Я попытался найти сравнения производительности и проблемы с производительностью Maven 3, но не смог ничего найти.
ОБНОВЛЕНИЕ
Я сделал еще несколько исследований, просмотрев исходники maven, и вот что я узнал:
При использовании jconsole я заметил, что большую часть времени (в 3.0.3) тратится внутри DefaultProjectDependenciesResolver.java
. Поэтому я загрузил исходный код в 3.0b1 и 3.0.3, чтобы посмотреть, что происходит. Я заметил, что в 3.0.3 есть две версии класса. Один находится в org.apache.maven.project
, а другой - в org.apache.maven
. Также похоже, что в 3.0.3 используется первое. Пошагово просматривая код, я заметил, что большая часть времени тратится, когда он достигает этого оператора:
node = repoSystem.collectDependencies( session, collect ).getRoot();
В 3.0b1 код выполняет:
ArtifactResolutionResult result = repositorySystem.resolve( request );
Я также заметил, что respositorySystem
имеет тип RepositorySystem
, а конкретная реализация - LegacyRepositorySystem
. Я предполагаю, что это использовалось, когда Maven 3 находился в бета-версии, пока не была создана новая реализация? Возвращаясь к версии 3.0.3, метод collectDependencies
находится в DefaultRepositorySystem.java
, который является частью org.sonatype.aether.impl.internal
. В конечном итоге это вызывает collectDependencies
внутри DefaultDependencyCollector.java
, который также является частью org.sonatype.aether.impl.internal
. Я предполагаю, что именно так строится граф зависимостей.
Теперь мне интересно, что это из-за того, как структурированы наши зависимости. Кто-нибудь видел такое поведение раньше?
ОБНОВЛЕНИЕ
В JIRA есть проблема , связанная с этой проблемой вместе с предлагаемым исправлением. Я опубликовал подробности в качестве ответа.
ОБНОВЛЕНИЕ
Проблема связана с версией эфира, которая используется в maven 3.0.3 (1.11). Версия 1.12 эфира устраняет эту проблему. Я проверил исходный код maven 3.0.3 и отредактировал POM, чтобы изменить версию эфира с 1.11 на 1.12. Затем я собрал maven из исходного кода и заменил мою текущую версию на созданную мной. Сокращение времени сборки является значительным.
Если вы не хотите собирать maven из исходных текстов, вы можете заменить библиотеки эфира, которые находятся в каталоге maven lib, версией 1.12. Это тоже должно сработать.
Я не уверен, что это изменение коснется версии 3.0.4, потому что разработчики maven сказали, что есть изменения лицензирования, идущие от эфира 1.11 к эфиру 1.12, и поэтому они все еще обсуждает это.