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

Можно ли в 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?


person Matt Quail    schedule 09.05.2011    source источник


Ответы (4)


Вы правы, что это не так просто, как должно быть. «примеси», которые описывают именно эту возможность, уже некоторое время находятся в дорожной карте Maven.

Вы можете использовать родительский POM, чтобы поделиться ими, предполагая, что все эти проекты имеют общего предка. Вы можете настроить только другой элемент, и он будет объединен с остальными, или же вы можете присвоить ему значение свойства, которое определено там, где он используется. Я понимаю, что в целом это не подходит для этого варианта использования, поскольку родитель описывает структуру, а не тип проекта.

Другой альтернативой является создание архетипа для такого проекта. Это позволяет вам определить его один раз и сгенерировать в новых проектах, но это не то, что можно повторно использовать напрямую.

На данный момент лучшим решением, вероятно, является собственный плагин — я считаю, что это вдохновило Дона Брауна на написание плагина mojo-executor, который сейчас находится по адресу: https://github.com/TimMoore/mojo-исполнитель. Но да, тогда вам нужна Java/Groovy :)

person Brett Porter    schedule 09.05.2011

Как и в случае с большинством проблем, с которыми вы столкнетесь в своем путешествии по Maven, ответ — Ant.

Создайте сценарий сборки Ant, который делает именно то, что вы хотите, а затем вызовите его с помощью maven-antrun. -плагин.

Поскольку все свойства, доступные для maven, также доступны в целевой конфигурации, вы можете настроить скрипт сборки через свойства maven.

Мейвен: 0, Муравей: 1.

КЭД.

person npellow    schedule 09.05.2011
comment
Ваш подход не позволяет использовать существующие плагины Maven (как в приведенном выше примере), не так ли? - person Matt Quail; 09.05.2011
comment
Можете ли вы изменить эти 3 плагина maven на эквивалентные задачи Ant? - person npellow; 10.05.2011

Возможно, вы могли бы создать проект только для pom, добавить туда эти 100 строк и унаследовать их в своих проектах через тег ‹parent›..

person mglauche    schedule 09.05.2011
comment
Это рабочий подход в малом (на что я намекнул в вопросе). Недостатком является то, что вы можете сделать это только один раз — например, вы не можете составить вместе несколько родителей. - person Matt Quail; 09.05.2011
comment
Вы можете создать цепочку иерархии... это будет немного запутанно, но должно работать. parent1-›parent2-›parent3-›ваш модуль - person mglauche; 09.05.2011

См. плагин Maven Tiles. Он отлично работает для меня.

person s13o    schedule 20.11.2012