Могут ли проекты maven иметь несколько родителей?

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

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

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

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

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

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

 база-П /
 | - Охота и рыбалка
 |  | - Охота и рыбалка
 |  |  `- pom.xml
 |  `- pom.xml
 | - Охота и рыбалка
 |  | - Охота и рыбалка
 |  |  `- pom.xml
 |  `- pom.xml
  `- pom.xml

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

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

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

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

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

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

    org.example my-shared-dependencies 0.0.1-SNAPSHOT pom import    

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

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

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

  org.example my-shared-dependencies 0.0.1-SNAPSHOT  

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

Единственный способ – иметь базовый 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) 

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

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

и объясните в документации Maven

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

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

 П-мастер
   | - Охота и рыбалка
   | - Охота и рыбалка

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

 проект (совокупный проект-flex & project-java)
   | - Общение
   |  `- pom.xml => parent = pom-java
   | - Общение
   |  `- pom.xml ==> parent = pom-flex
   `- pom.xml => parent = pom-master

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

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

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

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

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

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

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

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

Давайте будем гением компьютера.