Является ли хорошей идеей множество унаследованных профилей с одним плагином в Maven?

В нашей инфраструктуре есть множество небольших Java-проектов, созданных Maven2. У каждого проекта есть свой pom.xml, который в конечном итоге наследуется от родительского pom-мастера нашей единственной компании.

Недавно мы начали добавлять небольшие профили в наш родительский pom, отключенные по умолчанию, которые, когда они включены, выполняют один плагин обычным образом.

Примеры:

  • Профиль 'sources' запускает maven-source-plugin для создания jar исходников проекта.
  • Профиль 'clover' запускает maven-clover2-plugin для создания отчета Clover. Он также включает наш лицензионный файл Clover, поэтому его не нужно повторно указывать в дочерних проектах.
  • Профиль 'fitnesse' запускает fitnesse-maven-plugin для запуска фитнес-тестов, связанных с проектом. Он содержит хост и порт фитнес-сервера, а также другую информацию, которую не нужно повторять.

Это используется для указания сборок на нашем сервере CI, например:

mvn test -P clover
mvn deploy site-deploy -P fitnesse,sources

и так далее.

На данный момент это, кажется, обеспечивает удобный набор дополнительных функций.

Однако есть ли какие-либо опасности или подводные камни в продолжении этого подхода (очевидные или нет)? Может ли этот тип функциональности быть лучше реализован или выражен другим способом?


person Brian Laframboise    schedule 14.01.2009    source источник


Ответы (3)


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

Рассмотрим эти два вопроса: а) для чего нужны профили? б) с какими альтернативными подходами мы должны сравнить ваш подход?

Что касается а), я думаю, что профили предназначены для разных сред сборки или выполнения. Вы можете зависеть от локально установленного программного обеспечения, где вы будете использовать профиль для определения пути к исполняемому файлу в соответствующих средах. Или у вас могут быть профили для разных конфигураций времени выполнения, таких как «разработка», «тестирование», «производство». Подробнее об этом можно узнать на странице http://maven.apache.org/guides/mini/guide-building-for-other-environments.html и http://maven.apache.org/guides/introduction/introduction-to-profiles.html.

Что касается б), идеи, которые приходят мне в голову:

  1. запуск плагинов со свойствами командной строки. Например, mvn -Dfitnesse=true развернуть. Как хорошо известное -DdownloadSources=true для плагина eclipse или -Dmaven.test.skip=true для верного огня. Но для этого потребуется, чтобы у плагина был флаг для запуска выполнения. Не все плагины, которые вам нужны, могут иметь это.
  2. Называть цели явно. Вы можете вызвать несколько целей в одной командной строке, например, "mvn clean package war:exploded". Когда фитнес выполняется автоматически (с использованием соответствующего профиля), это означает, что его выполнение привязано к фазе жизненного цикла. То есть всякий раз, когда достигается эта фаза жизненного цикла, подключаемый модуль выполняется. Вместо того, чтобы привязывать выполнение плагина к фазам жизненного цикла, вы должны иметь возможность включать плагин, но выполнять его только тогда, когда он вызывается явно. Таким образом, ваш вызов будет выглядеть как «mvn Fitnesse: run source: jar deploy».

Ответ на вопрос а) может объяснить «странность». Это просто не то, для чего предназначены профили.

Поэтому я думаю, что альтернатива 2 может быть лучшим подходом. Использование профилей может стать проблематичным, когда в игру вступают «настоящие» профили для различных сред выполнения или сборки. В конечном итоге вы получите, возможно, запутанную смесь профилей, где профили означают очень разные вещи (например, «тест» будет обозначать среду, а «фитнес» — цель). Если бы вы просто назвали цели явно, я думаю, это было бы очень ясно и гибко. Запоминание названий плагинов/целей не должно быть более сложным, чем запоминание названий профилей.

person lutzh    schedule 14.01.2009
comment
Хороший момент о том, что плагины привязаны к фазе жизненного цикла. Это может на самом деле вызывать проблемы сейчас (хммм...) - person Brian Laframboise; 15.01.2009
comment
О прямом вызове плагина, как насчет связанной конфигурации? Я не хочу видеть mvn Fitnesse:remotecall -Dfitnesee.port=12345 во всех наших проектах, связанных с фитнесом, если порт изменится. Могу ли я получить лучшее из обоих миров (значения конфигурации унаследованы, но используются только при необходимости)? - person Brian Laframboise; 15.01.2009
comment
Я думаю, что конфигурация не зависит от выполнения, то есть вы все равно можете настроить ее, когда она не привязана к фазе цикла сборки. Вы можете просто настроить его один раз, однако, если у вас есть несколько исполнений, они должны иметь одинаковую конфигурацию. - person lutzh; 15.01.2009
comment
Некоторые плагины могут быть прикреплены к фазе по умолчанию. Я не знаю, сможете ли вы их отсоединить, это может быть проблемой. Возможно, вам придется определить свою собственную упаковку. Вы должны увидеть, что выполняется в вашей сборке, с помощью mvn help:describe -Dcmd=deploy - person lutzh; 15.01.2009
comment
@lutzh, у вас может быть конфигурация для каждого выполнения, см. - person Rich Seller; 31.07.2009
comment
упс, пропустил ссылку: maven.apache.org/guides /мини/ - person Rich Seller; 31.07.2009

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

Отдельные разработчики обычно сталкиваются с проблемами согласованности, потому что забывают, какой набор профилей следует использовать для данного сценария. Ваш пробег может отличаться, но у нас были настоящие проблемы с этим. Половина ваших разработчиков через короткое время забудет о «правильных» комбинациях и в конечном итоге будет тратить часы на регулярной основе, потому что запускает неправильные комбинации в неподходящее время.

Практическая проблема, с которой вы столкнетесь, заключается в том, что, насколько я знаю, нет никакого способа иметь набор «мета» профилей, которые активируют набор подпрофилей. Если бы был хороший способ создать профиль зонтика, это была бы действительно полезная функция. Ваши профили «фитнес» и «источники» действительно должны быть приватными, активированными одним или несколькими метапрофилями. (Вы можете активировать набор по умолчанию в settings.xml для каждого разработчика)

person krosenvold    schedule 14.01.2009
comment
Я думал, что это похоже на Maven re: декларативный (-Pfitnesse в отличие от fitnesee:remotecall и т. д.). Команда сборки также указывается только один раз, на сервере CI. Наконец, предполагается, что эти профили не требуются для «успешной» сборки. Поможет ли это предотвратить проблемы? - person Brian Laframboise; 14.01.2009
comment
Ну да декларативный. Но maven также продвигает единый способ ведения дел, а модель «выбирай и выбирай» — это не так. Разве ваши пользователи не проводят фитнес-тесты локально? Я знаю, что мы закончили с 10-15 небольшими профилями, чтобы покрыть все наши базы, что слишком много. Все начинается только с фитнеса - person krosenvold; 14.01.2009
comment
Integrationtest, Fitnesse, javadoc, Sources, Selenium, Jetty: Run, Cobertura, несколько безошибочных вариантов, jspc и, возможно, несколько, которые я забыл. Как только вы пойдете по этому пути, появится множество небольших плагинов, которые вы захотите настроить таким образом. - person krosenvold; 14.01.2009
comment
Но если вы обещаете использовать только его, я дам вам записку, в которой будет написано «хорошо»;) - person krosenvold; 14.01.2009
comment
Ха, заметил. :-) Clover показался мне хорошей идеей, так как мог бы содержать файл лицензии. У нас есть много плагинов в master pom, которые работают постоянно (surefire и т. д.). Поскольку нам никогда не требовался простой способ их условного отключения или неправильной настройки, я не помещал их в отдельные профили. - person Brian Laframboise; 15.01.2009
comment
Поскольку мы только начинаем расширять нашу инфраструктуру сборки, эти необязательные профили дают нам необходимую гибкость. Не в каждом проекте есть тесты, поэтому постоянно запускать Clover не имеет смысла. Однако, если вы добавите тесты, Clover должен запускаться обычным способом. - person Brian Laframboise; 15.01.2009
comment
Тем не менее, спасибо, что поделились своим опытом. Я начинаю лучше понимать, к чему это может нас привести. Возможно, я посмотрю, смогу ли я смоделировать функцию «метапрофиля» или, возможно, предложить ее для ядра Maven. - person Brian Laframboise; 15.01.2009

Нет проблем с наличием нескольких профилей в Maven, на самом деле я думаю, что это отличный способ разрешить вашей сборке включать и отключать классы функциональности. Я бы рекомендовал называть их на основе их функции, а не плагина, и рассмотреть возможность группировки функционально связанных плагинов в одном профиле.

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

Вам следует подумать о том, чтобы следовать этому подходу, чтобы ваш профиль «fitnesse» стал «интеграционным тестом», и вы могли бы определить дополнительные плагины в этом профиле, если это потребуется позже. Точно так же профиль «клевер» можно было бы переименовать в «сайт», и вы могли бы определить дополнительные отчеты в этом профиле, например. конфигурации для плагинов JDepend, JXR, PMD.

person Rich Seller    schedule 30.07.2009