Как указать distributionManagement широкую организацию знатока?

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

Единственное возможное решение, которое я нашел, состояло в том, чтобы создать проект основного англичанина всей организации, который действительно содержит эти настройки и заставляет весь другой pom.xml зависеть от этого основного англичанина через <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)

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

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

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

105
задан Bhargav Rao 25 August 2016 в 09:34
поделиться

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>

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

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

<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 из корневого каталога.

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

139
ответ дан 24 November 2019 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: