Почему Maven снова запускает тесты, когда JAR уже существует? - PullRequest
4 голосов
/ 02 ноября 2010

I install Мой Maven проект:

mvn clean install

Все отлично работает, файл JAR создается в каталоге /target. Теперь я запускаю его снова:

mvn install

Maven снова выполняет модульные тесты и статический анализ кода . Я не вносил никаких изменений в файлы .java, и JAR есть, так зачем снова запускать тесты? Я что-то не так делаю или так устроен maven?

Ответы [ 3 ]

6 голосов
/ 02 ноября 2010

Теперь я запускаю его снова (...) Maven выполняет модульные тесты и статический анализ кода снова

Потому что это просто то, что ты просишь, чтобы Мейвен сделал.

Когда вы вызываете фазу сборки , Maven будет выполнять не только эту фазу сборки, но также и каждую фазу сборки перед вызванной фазой сборки. Таким образом, ссылаясь:

mvn install

будет запускаться на каждой фазе сборки, предшествующей install (validate, compile, test, package и т. Д.), До выполнения install, а также подключаемых модулей, привязанных к этим фазам.

И хотя Maven поддерживает инкрементную компиляцию исходных кодов Java, другие плагины не настолько умны и будут запущены снова.

Теперь несколько замечаний / предложений:

  • какой смысл бегать install если ты ничего не менял?
  • если вы не хотите запускать статический анализ кода при каждой сборке, используйте специальный профиль.

Многомодульный проект с обширным тестированием и статическим анализом кода. Я запускаю mvn clean install, затем я изменяю один файл Java в одном модуле. Затем я запускаю mvn install и ожидаю, что maven протестирует / проанализирует только этот конкретный модуль, который был изменен. К сожалению, он повторно тестирует и повторно анализирует все модули.

Действительно, если вы запустите mvn install как часть сборки реактора, то запустите mvn install на всех модулях, а тесты и анализ будут снова выполнены на всех модулях. Возможно, это не то, что вы ожидаете, но это то, что вы получите (AFAIK, плагин статического анализа не знает об изменениях - я не могу объяснить, почему вещи не лучше).

Это занимает так много времени.

Я предлагаю использовать расширенные опции реактора , чтобы построить только подмножество модулей. Эти опции:

-rf, --resume-from
        Resume reactor from specified project
-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list
-amd, --also-make-dependents
        If project list is specified, also build projects that depend on projects on the list 

Так что в вашем случае вы можете запустить что-то вроде (при условии, что вы коснулись module-foo):

mvn -pl module-foo,my-packaged-app install

или, чтобы перестроить все проекты, которые зависят от module-foo:

mvn -pl module-foo -amd install
4 голосов
/ 02 ноября 2010

К сожалению, так устроен плагин maven install. Он применяет лучшие практики, такие как всегда запускать тесты перед установкой, потому что другие факторы среды могли измениться, даже если ваш код не изменился.

Если вы хотите компилировать только постепенно (то есть, только те файлы, которые изменились с момента последней сборки), тогда вы должны использовать плагин compiler, вызвав mvn compile, а затем для сборки jar используйте mvn jar:jar.

Чтобы пропустить тесты: mvn -Dmaven.test.skip=true install.

2 голосов
/ 02 ноября 2010

'test' - фаза по умолчанию в жизненном цикле 'build'.Если вы хотите пропустить тесты во время установки, добавьте это в pom.xml,

<build>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
        <skipTests>true</skipTests>
        </configuration>
    </plugin>
   </build> 

и затем создайте профиль с именем 'test', который будет содержать конфигурацию теста.Если вы хотите выполнить тесты, выполните mvn -Ptest test.

Поскольку ответная реакция на собачий удар уже получена, вы не можете пропустить другим способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...