Можете ли вы выполнить рефакторинг Maven pom.xml файлы в повторно используемые фрагменты XML?

#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. У меня это работает нормально.