Я пытаюсь понять, как организовать множество (около 50+) проектов maven2, чтобы их можно было развернуть в центральном репозитории nexus. При использовании mvn deploy
цели необходимо указать цель в теге distributionManagement следующим образом:
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
Теперь я не хочу, чтобы каждый pom.xml (из этих 50+) снова и снова содержал этот блок. Моим первым хоть и был бы settings.xml
файл, но мне кажется, что невозможно (по замыслу) определить его там. Итак, первый вопрос: почему это так? Если бы это было возможно, я мог бы указать его в settings.xml в дистрибутиве maven2, который можно было бы распространить среди всех разработчиков.
Единственное возможное решение, которое я нашел, - это создать проект master-pom для всей организации, который действительно содержит эти настройки, и сделать все остальные pom.xml зависимыми от этого master-pom через <parent>
тег. Но в многомодульных сборках это выглядит странно:
- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
- Project 1 module pom (with pm as parent)
- Project 2 module pom (with pm as parent)
Обычно я читаю во всей документации, что модули poms должны использовать родительский pom, а не какой-то другой. Но после прочтения сайта maven о наследовании против агрегирования написано, что это действительно возможно.
Одна проблема, которую я обнаружил, связана с генерацией сайта maven, которая, похоже, имеет проблемы с этой настройкой (модули не связываются правильно, если у них нет прямой обратной ссылки)
Итак, это правильный подход? Есть ли другое, более очевидное и простое решение проблемы?
Ответы:
Лучшее решение для этого - создать простой проект родительского файла pom (с упаковкой pom) в общем для всех проектов вашей организации.
Его можно создать, выпустить и развернуть в вашей локальной сети, чтобы каждый имел доступ к его артефакту.
Теперь для всех проектов, которые вы хотите использовать, просто включите этот раздел:
Это решение позволит вам легко добавлять другие общие вещи во все проекты вашей компании. Например, если вы хотите стандартизировать использование JUnit для определенной версии, это было бы идеальным местом для этого.
Если у вас есть проекты, в которых используются многомодульные структуры, у которых есть собственный родительский элемент, Maven также поддерживает наследование по цепочке, поэтому вполне допустимо, чтобы родительский файл pom вашего проекта ссылался на родительский файл pom вашей компании и чтобы дочерние модули проекта даже не знали о вашем материнская компания.
Из вашего примера структуры проекта я вижу, что вы пытаетесь поместить свой родительский проект на тот же уровень, что и ваш агрегатор pom. Если вашему проекту нужен собственный родительский элемент, лучший подход, который я нашел, - это включить родительский элемент на том же уровне, что и остальные модули, и разместить ваш файл агрегатора pom.xml в корне того места, где находятся все каталоги ваших модулей.
Что вы делаете с этой структурой, так это включаете свой родительский модуль в агрегатор и строите все с помощью
mvn install
из корневого каталога.Мы используем именно это решение в моей организации, оно выдержало испытание временем и хорошо сработало для нас.
источник
В родительском POM нет необходимости.
Вы можете полностью опустить часть distributionManagement в своих poms и установить ее либо на сервере сборки, либо в settings.xml.
Чтобы сделать это на сервере сборки, достаточно перейти к
mvn
команде:См. Https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html для получения подробной информации о том, какие параметры можно установить.
Также возможно установить это в вашем
settings.xml
.Просто создайте там профиль, который включен и содержит свойство.
Пример settings.xml:
Убедитесь, что учетные данные для «снимков» и «выпусков» находятся в
<servers>
разделе вашего settings.xml.Свойства altSnapshotDeploymentRepository и altReleaseDeploymentRepository представлены в maven-deploy-plugin версии 2.8. Более старые версии не будут отображаться с сообщением об ошибке
Чтобы исправить это, вы можете установить более новую версию плагина:
источник