Можете ли вы преобразовать файлы 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)


arrow_upward
4
arrow_downward

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

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

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

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

person Brett Porter    schedule 09.05.2011

arrow_upward
3
arrow_downward

Как и в случае с большинством проблем, с которыми вы столкнетесь в своем путешествии по 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

arrow_upward
1
arrow_downward

Возможно, вы могли бы создать проект только для 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

arrow_upward
1
arrow_downward

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

person s13o    schedule 20.11.2012