Есть ли способ заставить maven скопировать изменения папки ресурса постепенно?

Я использую Maven 2.2.1 и m2eclipse.

У меня есть две папки ресурсов.

Когда я сохраняю изменения в любом файле в любой из папок ресурсов, инкрементная сборка Maven запускает и повторно копирует ВСЕ файлы в обеих папках ресурсов в целевые папки.

Такое поведение было бы неплохо, если в папках ресурсов было относительно небольшое количество файлов, но достаточно, чтобы копия могла занимать несколько минут.

Есть ли способ заставить maven быть более избирательным в своей инкрементной сборке и скопировать только те ресурсы, которые были изменены?

Ответ 1

Я преследовал проблему до метода org.codehaus.plexus.util.FileUtils.copyFile(). Именно этот метод вызывается приложением maven-resource-plugin, чтобы в конечном итоге скопировать ресурс; метод copyFile() принимает параметр "overwrite" , который передает плагин ресурса (и значение по умолчанию действительно неверно), BUT...

Метод copyFile() игнорирует параметр "overwrite" , если список переданных фильтров не является пустым! И если у вас есть фильтрация, равная true для ваших ресурсов, этот список действительно не пуст.

Я могу понять аргументы в отношении copyFile(), игнорируя "переписывание": только потому, что конечный файл новее не означает, что новый фильтрованный файл будет таким же (т.е. значения для переменных в вашем файле ресурсов, возможно, были изменены с тех пор последняя фильтрация).
Игнорирование флага "overwrite" является "удобным" для разработчика FileUtils. Но это идет по отличной цене; один файл ресурса, который без необходимости обновляется, может вызывать отнимающие много времени, но избыточные процессы (например, перестроение jar-with-dependencies в моем случае). Это может быть всего несколько секунд, но может быть достаточно, чтобы нарушить поток интенсивного цикла компиляции кода.

Я искал открытую ошибку на FileUtils, но не нашел. Это меня подталкивало, поэтому я должен был преследовать его, но сейчас я не могу тратить на него больше времени... через несколько дней я хотел бы подать отчет об ошибке (может быть, быстрее реализовать правильное решение); если кто-нибудь сможет опубликовать ссылки на соответствующую систему отслеживания ошибок/отчетности, я был бы признателен.

Ответ 2

Попробуйте установить для параметра overwrite плагина ресурсов Maven значение false. http://maven.apache.org/plugins/maven-resources-plugin/resources-mojo.html#overwrite

Отредактировано: этот параметр существует с плагином ресурсов Maven версии 2.3. @Jared: проверьте свою версию.

Ответ 3

Вы можете попробовать обновить до последней версии m2eclipse и Maven 3. Существует новый API плагина Maven, который сообщает m2eclipse, какие файлы были затронуты плагином Maven. Я считаю, что плагин ресурса был обновлен до этого API (но убедитесь, что параметр перезаписи не установлен в true в конфигурации плагина ресурса).

Ответ 4

В конфигурации плагинов ресурсов Maven может быть опция, но я не нашел ее. Если бы я был вами, я бы разделил ресурсы и переместил их на отдельные модули, от которых вы зависите. Затем вы просто перестраиваете модуль, в который вы меняли файлы, а не другие, и все будет намного быстрее.

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

Ответ 5

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

Это не похоже, что это будет слишком сложно (некоторые неполные исходные коды здесь: http://maven.apache.org/plugins/maven-resources-plugin/xref/index.html), и вы можете включить свой собственный настраиваемый параметр конфигурации, чтобы изменить поведение перезаписи класса MavenResourcesExecution.

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