#xml #maven-2 #refactoring #maven-plugin
#xml #maven-2 #рефакторинг #maven-плагин
Вопрос:
В Maven возможно ли преобразовать часто повторяющиеся фрагменты в повторно используемую «библиотеку» (плагин)? Я понимаю, что могу писать свои собственные плагины, но часто функциональность, которую я хочу использовать повторно, уже выражена в виде фрагментов в pom.xml и я, естественно, склоняюсь к тому, что механизм повторного использования должен сохранять эти фрагменты как XML.
Показательный пример Я использовал процедуру (частично описанную здесь) для генерации файла WADL из исходного кода Jersey / JAX-RS, а затем генерировал документацию разработчика из этого WADL и собственного Javadoc исходного кода. Процедура на этой странице описывает выполнение двух плагинов, и я использую третий плагин (org.codehaus.mojo:exec-xsltproc) и мой собственный файл XSL для преобразования WADL в HTML.
Я использовал эту процедуру в нескольких проектах Maven. Шаблон содержит 100 строк XML. Что меняется между проектами, так это просто название пакета исходного кода, о котором идет речь ( com.example.myapp.rest
в связанном шаблоне). Поэтому невозможно переместить это в родительский pom или любой другой механизм, который не допускает параметризацию.
Что я хочу, так это объединить, удалить шаблон или иным образом преобразовать эти 100 строк (и один файл XST) в общее местоположение. Я понимаю, что многократно используемые выполнения maven выполняются с помощью плагинов Maven. В идеале мне не пришлось бы писать какую-либо Java (или Groovy) просто для повторного выражения того, что я уже выразил в XML.
Возможно ли выполнить рефакторинг Maven pom.xml файлы в формате XML?
Ответ №1:
Вы правы, что это не так просто, как должно быть. «миксины», которые точно описывают эту возможность, были в дорожной карте Maven в течение некоторого времени.
Вы можете использовать родительский POM для совместного использования, предполагая, что все эти проекты имеют общего предка. Вы можете настроить только другой элемент, и он будет объединен с остальными, или, альтернативно, вы можете присвоить ему значение свойства, которое определено там, где оно используется. Я понимаю, что в целом это не подходит для данного варианта использования, поскольку родительский элемент описывает структуру, а не тип проекта.
Другой альтернативой является создание архетипа для такого проекта. Это позволяет вам определить его один раз и сгенерировать в новых проектах, но это не то, что используется повторно напрямую.
На данный момент лучшим решением, вероятно, является пользовательский плагин — я полагаю, это вдохновило Дона Брауна на написание плагина mojo-executor, который сейчас находится по адресу:https://github.com/TimMoore/mojo-executor. Но да, тогда вам понадобится Java / Groovy 🙂
Ответ №2:
Как и в случае большинства проблем, с которыми вы столкнетесь на пути к Maven, ответ — Ant.
Создайте скрипт сборки Ant, который выполняет именно то, что вы хотите, затем вызовите его через maven-antrun-plugin.
Поскольку все свойства, доступные maven, также доступны в целевой конфигурации, вы можете настроить сценарий сборки с помощью свойств maven.
Maven: 0, Ant: 1.
QED.
Комментарии:
1. Ваш подход не допускает использования существующих плагинов Maven (как в примере выше), не так ли?
2. Можете ли вы заменить эти 3 плагина maven на эквивалентные задачи Ant?
Ответ №3:
Вероятно, вы могли бы создать проект только для pom, добавить туда эти 100 строк и наследовать их в своих проектах через тег <parent> ..
Комментарии:
1. Это работоспособный подход в малом размере (на который я намекал в вопросе). Недостатком является то, что вы можете сделать это только один раз — например, вы не можете объединить несколько родительских элементов.
2. Вы могли бы создать иерархию цепочки .. которая была бы немного запутанной, но должна работать. parent1-> parent2-> parent3-> ваш модуль
Ответ №4:
Смотрите Плагин Maven Tiles. У меня это работает нормально.