Как указать распределение распределений maven wide?

Я пытаюсь выяснить, как организовать много (около 50+) проектов maven2, чтобы они могли развертываться в центральном репозитории. При использовании цели 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 о Inheritance v. Aggregation написано, что это действительно возможно.

Одна из проблем, которые я обнаружил, - это генерация сайта maven, которая, похоже, имеет проблемы с этой настройкой (модули не связаны правильно, если у них нет прямой обратной ссылки)

Итак, это правильный подход? Любое другое, более очевидное, более простое решение проблемы?

Ответ 1

Лучшее решение для этого - создать простой проект родительского файла pom (с упаковкой "pom") для всех проектов вашей организации.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>your.company</groupId>
    <artifactId>company-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <distributionManagement>
        <repository>
            <id>nexus-site</id>
            <url>http://central_nexus/server</url>
        </repository>
    </distributionManagement>

</project>

Это может быть построено, выпущено и развернуто на вашем локальном нексусе, так что каждый может получить доступ к его артефакту.

Теперь для всех проектов, которые вы хотите использовать, просто включите этот раздел:

<parent>
  <groupId>your.company</groupId>
  <artifactId>company-parent</artifactId>
  <version>1.0.0</version>
</parent>

Это решение позволит вам легко добавлять другие общие вещи ко всем проектам вашей компании. Например, если вы хотите стандартизировать использование JUnit для конкретной версии, это было бы идеальным местом для этого.

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

Из вашего примера структуры проекта я вижу, что вы пытаетесь поставить родительский проект на тот же уровень, что и ваш агрегатор pom. Если вашему проекту нужен собственный родительский объект, наилучший подход, который я нашел, состоит в том, чтобы включить родительский уровень на том же уровне, что и остальные модули, и иметь свой файл агрегатора pom.xml в корне, где существуют каталоги всех ваших модулей.

- pom.xml (aggregator)
    - project-parent
    - project-module1
    - project-module2

Что вы делаете с этой структурой, так это включаете ваш родительский модуль в агрегатор и собираете все с помощью mvn install из корневого каталога.

Мы используем это точное решение в моей организации, и оно выдержало испытание временем и сработало для нас.

Ответ 2

Нет необходимости в родительском POM.

Вы можете полностью опустить часть distributionManagement в своих poms и установить ее либо на своем сервере сборки, либо в файле settings.xml.

Чтобы сделать это на сервере сборки, просто введите команду mvn:

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases

Подробнее см. https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html.

Это также можно установить в вашем settings.xml.

Просто создайте там профиль, который включен и содержит свойство.

Пример settings.xml:

<settings>
[...]
  <profiles>
    <profile>
      <id>nexus</id>
      <properties>
        <altSnapshotDeploymentRepository>snapshots::default::https://YOUR_NEXUS_URL/snapshots</altSnapshotDeploymentRepository>
        <altReleaseDeploymentRepository>releases::default::https://YOUR_NEXUS_URL/releases</altReleaseDeploymentRepository>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

</settings>

Убедитесь, что учетные данные для "снимков" и "выпусков" находятся в разделе <servers> вашего файла settings.xml

Свойства altSnapshotDeploymentRepository и altReleaseDeploymentRepository представлены в плагине maven-release-plugin версии 2.8. Старые версии не будут работать с сообщением об ошибке

Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

Чтобы это исправить, вы можете использовать более новую версию плагина:

        <build>
                <pluginManagement>
                        <plugins>
                                <plugin>
                                        <artifactId>maven-deploy-plugin</artifactId>
                                        <version>2.8</version>
                                </plugin>
                        </plugins>
                </pluginManagement>
        </build>