2013-07-05 3 views
10

У нас есть большая и глубокая структура модуля с тремя «реальными» слоями наследования и тремя-четырьмя уровнями агрегации модулей.Наследование модуля maven vs aggregation

У меня все в порядке с настоящим наследованием: крупный супермассой компании, родительский продукт и родительский клиент для настройки продукта.

Но я наблюдаю, что также «пустые» агрегационные модули определяются как родители их подмодулей.

Если все понятие такое же, как и в OO, это не имеет для меня никакого смысла, если агрегатные модули (они пусты, кроме их подмодулей) не добавляют никакой конкретной конфигурации для pom.

Есть ли другая причина (возможно, операционная), почему это может быть полезно?

Sidenote: Введение в pom не ясно в этом отношении: термин «родительский» не ясен: это может означать супер-pom (= родительское дерево наследования) или агрегирование pom (= parent в файловой системе ...)

+0

, это не ответит на ваш вопрос, но если вы разделили агрегацию от наследования (что я также склонны делать), почему вы наследуете от своих агрегаторов? в помах, которые получают агрегированные данные, не указывайте раздел или наследуйте от своего настоящего родителя. В принципе, «пустые» агрегирующие модули определяются как родители их подмодулей_ не являются обязательными. не делайте этого, если это не имеет смысла – Hilikus

ответ

12

Существует большая проблема в определении этих понятий в сообществе maven. Вы правы, с указанием, что родителя-П является наследованием и модуль П является составом. Но, к сожалению, разделение этих двух концепций не имеет истории в maven. В документации maven четко говорится, что лучше их разделить. Это приведет к созданию этой идеальной структуры

app-api/ 
app-impl/ 
app-war/ 
app-parent/ 
pom.xml 

Где pom.xml является модулем pom.

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

У этого есть причина: многие плагины не отличаются друг от друга. И даже сам maven принимает другую настройку: если <relativePath> не установлен, Maven предполагает, что родительский элемент находится в ... Поэтому каждый проект должен указывать на <relativePath>../app-parent</relativePath> в качестве родителя.

Самый популярный плагин, который имеет огромные проблемы с упомянутой структурой, - это плагин maven-release-плагин! Вы столкнетесь с чужими проблемами, если не будете следовать предположению, что модуль-pom является родительским pom.

Худшая ошибка заключается в том, что плагин release не может заменить свойства версии в родительском объекте и не удается из-за SNAPSHOT-зависимостей. Ваш родитель, возможно, будет содержать что-то вроде этого

<properties> 
    <app-api.version>1.1-SNAPSHOT</app-api.version> 
    <app-impl.version>1.2-SNAPSHOT</app-impl.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>myorg</groupId> 
      <artifactId>app-api</artifactId> 
      <version>${app-api.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>myorg</groupId> 
      <artifactId>app-impl</artifactId> 
      <version>${app-impl.version}</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Обычно, высвобождая эти свойства будут автоматически установлены в их версиях выпуска 1.1 и 1.2. Но релиз-плагин (проверенный до версии 2.2.2) терпит неудачу с сообщением о том, что модуль не может быть выпущен с зависимостями моментальных снимков.

Если вы только «пропустите» некоторые модульные модули, это может быть проблемой, если вы правильно определяете <relativePath>. Но вы должны попробовать и ожидать некоторые ошибки в плагинах maven. Помимо этих ошибок, вы совершенно правы, чтобы разделить попов, и я бы попробовал, если у вас есть время сделать изолированную версию.

+2

Другой способ обоснования лучшего способа сделать это - это обеспечить «разделение проблем». Разделяя понятия наследования и аггеграции, они могут быть более гибкими. –

0

Наследование родительского помпа полезно, если у вас есть свойства, действительные для нескольких проектов.Из того, что я понял, вы уже получили эту часть;;)

То, что вы называете агрегационными модулями, также имеет практическое применение. Вы можете сгруппировать несколько подмодулей в одиночную помпу. Если вы хотите создать свой проект, вы, в основном, не хотите строить каждый модуль, но присоединяете их к одному приложению. Это может быть сделано такой пом, которая ссылается на все подмодули как таковые. Это не может быть сделано только с концепцией родительского пом, поскольку он ничего не знает о других модулях.

0

Короткий ответ IIUC - это то, что вы не наследуете от своих постов, основанных только на агрегации. Вы выполняете, когда ваш агрегатор совпадает с вашим родителем, как в канонической структуре maven. Но если вы отделите агрегатор от родителя, не наследуйте его от агрегатора