Есть ли способ заставить 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.
Если вы чувствуете общинное настроение, вы можете отправить патч обратно в репозиторий плагинов, чтобы другие могли воспользоваться обновлением.