Ответ 1
https://issues.apache.org/jira/browse/MCOMPILER-209
Используйте его с болгарской нотацией (да ↔ no)
<useIncrementalCompilation>false</useIncrementalCompilation>
означает true и наоборот
Даже если я поменяю только один из моих классов, Maven всегда перекомпилирует их все. Я использую эту конфигурацию плагина:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<staleMillis>1</slateMillis>
<useIncrementalCompilation>true</useIncrementalCompilation>
</configuration>
</plugin>
</plugins>
Это происходит с mvn compile
, mvn package
и mvn install
.
Конечно, это не проблема, если у вас есть 10-15 файлов. Тем не менее, у меня есть более тысячи исходных файлов, и это занимает много времени.
Есть ли в плагине компилятора Maven скрытые настройки для перекомпиляции только измененных файлов? Есть ли обходные пути?
https://issues.apache.org/jira/browse/MCOMPILER-209
Используйте его с болгарской нотацией (да ↔ no)
<useIncrementalCompilation>false</useIncrementalCompilation>
означает true и наоборот
Хотя вы можете указать Maven "перекомпилировать только измененные файлы", это приведет к неверным результатам. Поведение по умолчанию - это не ошибка, а намеренное дизайнерское решение.
useIncrementalCompilation
деле делает useIncrementalCompilation
Документация на эту тему, мягко говоря, не оптимальна. Вот что действительно происходит (на основе исходного кода AbstractCompilerMojo из maven-compiler-plugin
3.3):
useIncrementalCompilation
установлен в false
(не рекомендуется) useIncrementalCompilation
установлен в true
(по умолчанию) Changes detected - recompiling the module!
Итак, в итоге, useIncrementalCompilation
всегда следует оставить по умолчанию в useIncrementalCompilation
true
.
Понятно, что можно спросить: почему плагин не определяет, какие классы затронуты изменениями, а перекомпилирует только эти классы? В комментариях к MCOMPILER-205 разработчик Maven Роберт Шольте дал краткое обоснование, а затем подтвердил следующее подробное объяснение:
Если какой-либо исходный файл был изменен или удален, все файлы будут удалены и перекомпилированы. Причина этого в том, что простая перекомпиляция всего с помощью стандартного java-компилятора довольно быстрая, вероятно, намного быстрее, чем альтернатива, которая будет выглядеть примерно так:
- обнаружить все измененные файлы
- проанализировать все исходные файлы, чтобы отобразить все отношения между классами
- рассчитать все затронутые файлы
- перекомпилировать поврежденные файлы
Однако, как пишет Роберт, перекомпиляция всего, вероятно, не является необходимой, если в проекте используется компилятор Eclipse, который выполняет этот анализ. Но для современных пользователей Maven это спорный вопрос, поскольку maven-compiler-plugin
еще не меняет своего поведения в зависимости от выбора компилятора.
Вероятно, плохая новость: см. ошибку MCOMPILER-205.
Откат maven-compiler-plugin до версии 2.3.2 компилирует только измененные файлы без каких-либо дополнительных настроек.