Могут ли проекты Maven иметь нескольких родителей? - PullRequest
53 голосов
/ 28 октября 2009

У нас есть проекты Java и Flex на работе. В настоящее время у нас есть 1 базовый модуль, который содержит конфигурации, которые мы хотим использовать для обоих проектов. Проблема заключается в следующем: проекты Flex наследуют конфигурацию, например, для javadoc и pmd, чего они не хотят.

Я хочу сделать это немного более чистым и иметь реальную базовую помпу, а затем java-base-pom и flex-base-pom. Но как это работает в мультимодуле, который имеет как гибкую, так и Java-часть?

У нас есть плагины для нашего собственного приложения, где мы используем следующую структуру:

  • мой-плагин
    • my-plugin-client (flex)
    • my-plugin-server (java)

Мой плагин просто содержит pom.xml с разделом. Я бы использовал my-plugin pom.xml в качестве родителя для обоих, но тогда я не могу также использовать java base-pom или flex base-pom также в качестве родителя. Что было бы лучшим подходом для этого?

Ответы [ 6 ]

33 голосов
/ 28 октября 2009

Проект может иметь только одного родителя (в отличие от множественного наследования в C ++), но этот родитель может быть частью большей родительской иерархии. Как указали другие, вы можете получить что-то вроде этого:

base-pom/
|-- flex-base-pom
|   |-- my-plugin-client
|   |   `-- pom.xml
|   `-- pom.xml
|-- java-base-pom
|   |-- my-plugin-server
|   |   `-- pom.xml
|   `-- pom.xml
 `-- pom.xml

Тем не менее, я заметил, что вы написали, что ваша настоящая проблема заключается в следующем:

Проекты Flex наследуют конфигурацию для javadoc и pmd, например, которую они не хотят.

Вы должны использовать элемент pluginManagement, чтобы избежать этой ситуации:

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

Итак, в родительском pom сконфигурируйте свои плагины в pluginManagement (например, javadoc и pmd) и укажите их в элементе plugins в нужных дочерних элементах (только в my-plugin-server здесь). Это решит вашу текущую проблему.

21 голосов
/ 26 августа 2016

Несмотря на то, что у проектов maven есть один родитель, они могут импортировать любое количество других pom, например:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>my-shared-dependencies</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Это имеет два важных различия по сравнению с родителем:

  1. Плагины, определенные в импортированном pom, не будут импортированы
  2. Зависимости, определенные в импортированном pom, не будут добавлены к текущему pom, будут импортировать только зависимости в раздел управления зависимостями

Однако, если у вашего родительского pom есть раздел , и вы хотите включить его в свои зависимости, вы можете добавить родителя в раздел зависимостей, как обычную зависимость:

<dependency>
    <groupId>org.example</groupId>
    <artifactId>my-shared-dependencies</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

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

6 голосов
/ 28 октября 2009

Единственный способ - использовать base-pom в качестве родителя для java-base-pom и flex-base-pom.

У меня похожая структура для моих весенних проектов:

base-pom (basic configuration - eclipse, reports, repositories, etc)
|
+ spring-base-pom (spring definitions)
  |
  + spring-jar-base-pom (jar specific definitions)
  |
  + spring-war-base-pom (spring web and servlet dependencies)
    |
    + spring-webapp-base_pom (spring web mvc dependencies)
4 голосов
/ 12 ноября 2012

Я тоже столкнулся с этой проблемой, и лучшее решение, которое я нашел, - это использовать Наследование и Агрегацию, как предлагается в этом вопросе: Поддерживает ли maven несколько родителей (множественное наследование)?

У вас может быть агрегатор pom, который не является родительским для проектов агрегаты.

и объясните в

Maven документации

Наследование и агрегация создают хорошую динамику для управления сборками через одно высокоуровневое POM (...) И наоборот, проект POM может объединять проекты, которые не наследуются от него.

Исходя из этого, у меня было наследование POM (pom-master содержит конфигурации коммун, а у каждого из них специфические конфигурации):

pom-master
  |-- pom-java
  |-- pom-flex

и, таким образом, мой проект может получить специфику для конфигурации каждого модуля по желанию:

project (aggregate project-flex & project-java)
  |-- project-java
  |      `-- pom.xml => parent = pom-java
  |-- project-flex
  |       `-- pom.xml ==> parent = pom-flex
  `-- pom.xml => parent = pom-master

Надеюсь, это поможет и другим:)

2 голосов
/ 28 октября 2009

Просто представьте, что pom.xml на самом деле являются классами Java: у вас может быть только один родитель (или расширение класса), но у этого родителя также может быть другой родитель и т. Д.

Как я объяснил здесь , вы должны различать родительский и агрегирующий принципы в Maven, что означает, что my-plugin будет рассматриваться как проект агрегации, а не обязательно как родительский проект для обоих my-plugin- клиент и мой плагин-родитель.

Итак, подведем итог:

my-plugin определит базовую помпу для всех ваших проектов. Затем вы создаете два новых проекта pom : java-base-pom и flex-base-pom. Они оба my-plugin в качестве родителя. Теперь my-plugin-client будет иметь java-base-pom в качестве родителя, а my-plugin-server будет использовать flex-base-pom в качестве родителя.

Таким образом, my-plugin-client наследует все свойства, определенные в my-plugin pom.xml, а также в проекте java-base-pom.

0 голосов
/ 21 декабря 2012

Вы можете добиться множественного наследования с профилями:

Вы создаете (несколько) профилей в корневом модуле и автоматически активируете любой вариант этих профилей, что обеспечивает множественное наследование конфигурации maven.

...