Как определить распределенную организацию управления maven? - PullRequest
97 голосов
/ 21 июля 2010

Я пытаюсь выяснить, как организовать много (около 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, которая, похоже, имеет проблемы с этой настройкой (модули не связываются правильно, если у них нет прямой обратной ссылки)

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

Ответы [ 2 ]

135 голосов
/ 21 июля 2010

Лучшее решение для этого - создать простой проект родительского файла 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 из корневого каталога.

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

6 голосов
/ 10 апреля 2019

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

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

Для этогона сервере сборки просто передайте команду mvn:

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=snapshots::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

...