Как maven компилирует только измененные файлы Java?
Мне было просто интересно узнать, что, когда я выполняю установку mvn без выполнения команды clean, maven компилирует только измененные файлы java. Как maven определяет, что файл Java изменен или нет? Я считаю, что он не использует последнее измененное свойство файла.
Причина моего убеждения: у меня был модуль, после объединения изменений из svn я дал mvn install, и он не скомпилировал измененный файл, и когда я посмотрел на изменение, я увидел, что "long" были изменены на "Long" в добытчики и сеттеры.
Так что я просто хочу знать, как maven определяет, изменился ли файл Java или нет?
(PS Я использую Apache Maven 3.0.3, если это имеет значение)
3 ответа
Я считаю, что плагин компилятора Maven использует даты последнего изменения в исходных файлах и файлах классов для определения необходимости перекомпиляции.
На сайте компилятора довольно мало информации, но compiler:compile
На странице цели есть информация о следующем атрибуте, который точно настраивает расчеты устаревания: http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html. Это единственное официальное заявление, касающееся устаревания.
Не зная много о maven, я могу сказать вам, что в общем, инструменты типа "make" используют временную метку "последнее изменение", которая объяснит проблему, с которой вы столкнулись при работе с svn (см. Википедию о слабостях Subversion.
Комментарий Роберта Шолта на https://issues.apache.org/jira/browse/MCOMPILER-205 объясняет этот процесс. Это зависит от опции "useIncrementalCompilation" в "maven-compiler-plugin" (и от его версии, между прочим, мне удалось заставить "useIncrementalCompilation" работать только с 3.1, а не с 3.0):
Я вижу, что есть некоторая путаница, поэтому необходимо что-то изменить, может быть, улучшение документации достаточно хорошо. Глядя на код, вы увидите, что неинкрементный будет смотреть только на измененные исходные файлы. Инкрементный также проверяет, изменились ли зависимости и были ли файлы добавлены или удалены. Если он изменился, он удалит полный каталог классов. Причина в том, что java-компилятор по умолчанию довольно быстрый, вероятно, гораздо быстрее, чем анализирует для каждого файла, что с ним делать. IIUC компилятор eclipse является реальным инкрементным компилятором, поэтому мы можем решить, что на основе используемого компилятора не удалять каталог классов.