Мэйвен родитель против модулей пом пом
кажется, есть несколько способов структурировать родительские poms в сборке мультипроекта, и мне интересно, есть ли у кого-нибудь мысли о том, какие преимущества / недостатки есть в каждом способе.
самый простой способ иметь Родительский pom-это поместить его в корень проекта, т. е.
myproject/
myproject-core/
myproject-api/
myproject-app/
pom.xml
где пом.XML-это как для родительского проекта, а также описывает ядро -API и приложения, модули
следующий метод состоит в том, чтобы отделить родителя в свой собственный подкаталог как в
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
где Родительский pom все еще содержит модули, но они относительны, например ../myproject-core
наконец, есть опция, где определение модуля и родитель разделены как в
myproject/
mypoject-parent/
pom.xml
myproject-core/
myproject-api/
myproject-app/
pom.xml
где Родительский pom содержит любую" общую " конфигурацию (dependencyManagement, свойства и т. д.) и myproject / pom.xml содержит список модулей.
намерение состоит в том, чтобы быть масштабируемым для крупномасштабной сборки поэтому следует масштабировать большое количество проектов и артефактов.
несколько бонусных вопросов:
- где лучшее место для определения различных общей конфигурации как в системе управления версиями, каталоги развертывания, общие плагины и т. д. (Я предполагаю, что родитель, но я часто был укушен этим, и они оказались в каждом проекте, а не в общем).
- как плагин maven-release, hudson и nexus справляются с тем, как вы настраиваете свой мультипроекты (возможно, гигантский вопрос, это больше, если кто-то был пойман, когда был создан сборщик мультипроектов)?
Edit: каждый из подпроектов имеет свой собственный pom.xml, я оставил его, чтобы сохранить его кратким.
4 ответов:
на мой взгляд, Чтобы ответить на этот вопрос, нужно думать в терминах жизненного цикла проекта и контроля версий. Другими словами, имеет ли Родительский pom свой собственный жизненный цикл, т. е. Может ли он быть выпущен отдельно от других модулей или нет?
если ответ да (и это относится к большинству проектов, которые были упомянуты в вопросе или в комментариях), то Родительский pom нуждается в своем собственном модуле с точки зрения VCS и с точки зрения Maven, и вы закончите вверх с чем-то вроде этого на уровне VCS:
root |-- parent-pom | |-- branches | |-- tags | `-- trunk | `-- pom.xml `-- projectA |-- branches |-- tags `-- trunk |-- module1 | `-- pom.xml |-- moduleN | `-- pom.xml `-- pom.xmlэто делает проверку немного болезненным и распространенным способом борьбы с этим является использование
svn:externals. Например, добавьте :root |-- parent-pom | |-- branches | |-- tags | `-- trunk | `-- pom.xml |-- projectA | |-- branches | |-- tags | `-- trunk | |-- module1 | | `-- pom.xml | |-- moduleN | | `-- pom.xml | `-- pom.xml `-- trunksсо следующим внешним определением:
parent-pom http://host/svn/parent-pom/trunk projectA http://host/svn/projectA/trunkпроверка
trunksзатем приведет к следующей локальной структуре (шаблон #2):root/ parent-pom/ pom.xml projectA/дополнительно, вы даже можете добавить
pom.xmlнаtrunksкаталог:root |-- parent-pom | |-- branches | |-- tags | `-- trunk | `-- pom.xml |-- projectA | |-- branches | |-- tags | `-- trunk | |-- module1 | | `-- pom.xml | |-- moduleN | | `-- pom.xml | `-- pom.xml `-- trunks `-- pom.xmlэтой
pom.xmlэто своего рода" поддельный " pom: он никогда не выпускается, он не содержит реальной версии, так как этот файл никогда не выпускается, он содержит только список модулей. С помощью этого файла проверка приведет к такой структуре (шаблон #3):root/ parent-pom/ pom.xml projectA/ pom.xmlэтот " хак " позволяет запустить сборку реактора из корня после проверки и сделать вещи еще более удобными. На самом деле, именно так мне нравится настраивать проекты maven и репозиторий VCS для большой строит: он просто работает, он хорошо масштабируется, он дает всю гибкость, которая вам может понадобиться.
если ответ нет (возвращаясь к первоначальному вопросу), то я думаю, что вы можете жить с шаблоном № 1 (сделать самую простую вещь, которая может работать).
теперь о бонусных вопросах:
- где лучше всего определить различные общие конфигурации, как в системе управления версиями, каталоги развертывания, общие плагины и т. д. (Я предполагаю, что родитель, но я часто был укушен этим, и они оказались в каждом проекте, а не в общем).
честно говоря, я не знаю, как не дать общий ответ здесь (например, "используйте уровень, на котором, по вашему мнению, имеет смысл взаимовлиять вещи"). И в любом случае, дочерние poms всегда могут переопределять унаследованные настройки.
- как плагин maven-release, hudson и nexus справляются с тем, как вы настройте свои мультипроекты (возможно, гигантский вопрос, это больше, если кто-то был пойман, когда был настроен сборщик нескольких проектов)?
настройки я использую работает хорошо, ничего особенного, чтобы упомянуть.
на самом деле, мне интересно, как плагин maven-release имеет дело с шаблоном #1 (особенно с
<parent>раздел, так как вы не можете иметь зависимости моментальных снимков во время выпуска). Это звучит как проблема с курицей или яйцом, но я просто не могу помните, если он работает и было слишком ленив, чтобы проверить его.
из моего опыта и лучших практик Maven есть два вида "родительских poms"
"company" parent pom-этот pom содержит информацию и конфигурацию вашей компании, которые наследуют каждый pom и не нуждаются в копировании. Эти сведения являются следующими:
- репозитории
- разделы управления распределением
- общие конфигурации плагинов (например, maven-compiler-plugin source and target версии)
- организации, разработчики и т. д.
подготовка этого родительского pom должна быть сделана с осторожностью, потому что все ваши компании POM унаследуют от него, поэтому этот pom должен быть зрелым и стабильным (выпуск версии родительского pom не должен влиять на выпуск всех ваших проектов компании!)
- второй вид родительского pom является многомодульным родителем. Я предпочитаю ваше первое решение - это соглашение maven по умолчанию для многомодульных проектов, очень часто представляет структуру кода VCS
намерение состоит в том, чтобы быть масштабируемым для крупномасштабной сборки, поэтому должно быть масштабируемым для большого количества проектов и артефактов.
Mutliprojects имеют структуру деревьев-так что вы не arrown до одного уровня родительского pom. Попробовать найти подходящий струтура проекта для ваших нужд - это классический образец, как распространять проекты mutimodule
distibution/ documentation/ myproject/ myproject-core/ myproject-api/ myproject-app/ pom.xml pom.xmlнесколько бонусных вопросов:
- где лучшее место для определения различных общей конфигурации как в системе управления версиями, каталоги развертывания, общие плагины и т. д. (Я предполагаю, что родитель, но я часто был укушен этим, и они оказались в каждом проекте, а не в общем).
эта конфигурация должна быть разумно разделена на" компанию " Родительский pom и проект Родительский pom(ы). Вещи, связанные со всем вашим проектом, идут в" компанию " родителя и это связанный с текущим проектом перейдите в проект one.
- как плагин maven-release, hudson и nexus справляются с тем, как вы настраиваете свои мультипроекты (возможно, гигантский вопрос, это больше, если кто-то был пойман, когда был настроен сборщик нескольких проектов)?
компания-родитель pom должны быть выпущены в первую очередь. Для мультипроектов применяются стандартные правила. CI-сервер должен знать все, чтобы правильно построить проект.
независимый родитель является лучшей практикой для совместного использования конфигурации и параметров между другими несвязанными компонентами. Apache имеет Родительский проект pom для обмена юридическими уведомлениями и некоторыми общими вариантами упаковки.
Если ваш проект верхнего уровня имеет реальную работу в нем, например, агрегирование javadoc или упаковка выпуска, то у вас будут конфликты между настройками, необходимыми для выполнения этой работы, и настройками, которые вы хотите поделиться через родителя. Один Родительский проект позволяет избежать этого.
общий шаблон (игнорируя #1 на данный момент) состоит в том, что проекты с кодом используют Родительский проект в качестве своего родителя и используют его на верхнем уровне в качестве родителя. Это позволяет основным вещам быть общими для всех, но избегает проблемы, описанной в #2.
плагин сайта будет очень запутан, если родительская структура не совпадает со структурой каталогов. Если вы хотите построить агрегированный сайт, вы будете нужно немного повозиться, чтобы обойти это.
Apache CXF является примером шаблона в #2.
есть одна маленькая загвоздка с третьего подхода. Поскольку совокупный англичане (мой проект/пом.xml) обычно не имеют родителя вообще, они не разделяют конфигурацию. Это означает, что все эти агрегированные Pom будут иметь только репозитории по умолчанию.
это не проблема, если вы используете только плагины из Central, однако это не удастся, если вы запустите плагин с помощью формата plugin:goal из вашего внутреннего репозитория. Например, вы можете иметь
foo-maven-pluginс groupIdorg.exampleобеспечение голgenerate-foo. Если вы попытаетесь запустить его из корня проекта с помощью команды типаmvn org.example:foo-maven-plugin:generate-foo, он не будет работать на агрегатных модулях (см. примечание по совместимости).возможны несколько решений:
- развертывание плагина в Maven Central (не всегда возможно).
- укажите раздел репозитория во всех ваших агрегированных POMs (breaks сухой принципе).
- сконфигурируйте этот внутренний репозиторий в настройки.xml (либо в локальных настройках в~/.м2/настройки.xml или в глобальных настройках в /conf / settings.XML.) Сделает сборку неудачной без этих настроек.xml (может быть хорошо для больших внутренних проектов, которые никогда не должны быть построены за пределами компании).
- используйте родительские настройки репозиториев в ваших агрегированных POMs (может быть слишком много родительских POMs?).
Comments