Maven - создание дочерних проектов, которые могут быть независимыми от их родителей - PullRequest
29 голосов
/ 13 ноября 2009

Я немного новичок в Maven, и я пытаюсь настроить проект maven, который создает несколько дочерних проектов, но все же позволяет кому-то просто взять один из дочерних проектов и построить его независимо без родителя.

parentfolder
  ->pom.xml
  ->project1
    ->pom.xml
    ->src
  ->project2
    ->pom.xml
    ->src
  ->project3
    ->pom.xml
    ->src

По сути, я хочу, чтобы кто-то мог иметь возможность извлекать родительские папки и делать mvn-компиляцию для сборки всех проектов, а также чтобы кто-то мог иметь возможность извлекать только project1 и делать mvn-компиляцию для сборки только этого.

Я пытался объявить подпроекты как модули в pom.xml верхнего уровня,

<modules>
  <module>project1</module>
  <module>project2</module>
  <module>project3</module>
</modules>

Но для этого требуется, чтобы информация о родительском pom.xml была объявлена ​​в дочерних элементах. Это делает дочерние проекты зависимыми от присутствия родительского pom.xml, чего я и хотел избежать.

Ответы [ 5 ]

55 голосов
/ 13 ноября 2009

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

РОДИТЕЛИ

Первая концепция заключается в том, что проект объявляет в своем pom.xml родителя:

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>foo</groupId>
        <artifactId>bar</artifactId>
        <version>42</version>
    </parent>
    ...

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

Интерес родительской концепции в Maven 2 заключается в наследовании свойств, зависимостей, конфигурации. Это место, где вы разместите всю общую информацию о детских проектах.

Это точно такая же концепция extends в языке Java.

агрегация

В этом случае у вас есть проект, который объединяет несколько подмодулей, указав их имена в module узлах:

<modules>
    <module>commons</module>
    <module>client</module>
    <module>server</module>
    ...
</modules>

Это означает, что каждая команда, которую вы запустите в этом корневом проекте, будет выполняться на каждом модуле (порядок определяется реактором Maven 2). Например, если вы запускаете mvn clean install в корневом проекте, Maven 2 выполнит эту команду в корневом проекте, затем в проекте commons, затем в client и, наконец, в server.

.

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

Вот схема, которая показывает две разные концепции:

alt text

У вас есть более подробное объяснение этих двух понятий в Maven: Полное руководство, здесь .

1 голос
/ 18 ноября 2009

Подпроекты зависят только от родителя, если они используют тег (наследование maven). Вы не обязаны использовать тег в подмодулях. Однако, если вы хотите, чтобы ваши модули наследовали общие элементы от родительского pom, вы должны использовать наследование maven.

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

0 голосов
/ 22 августа 2013

Эту проблему можно решить, используя Агрегирование проекта maven вместо Наследование проекта .

0 голосов
/ 19 января 2010

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

  1. наследует определенные настройки от общего родителя, но
  2. имеет две сборки различных приложений, совместно использующих общий компонент.

Таким образом, мы имеем здесь два разных понимания родительских отношений. Во-первых, «родитель» вносит настройки для каждого модуля, а во-вторых, «родитель», чья сборка создает дочерний. Поскольку есть два из последних, это ломается. Две идеи происхождения встречаются на пути друг друга.

0 голосов
/ 13 ноября 2009

Родительский pom и его версия должны быть объявлены в дочерних элементах.

Если в ваших проектах объявлен родительский объект, он должен быть доступен либо в сборке, поэтому один из модулей должен быть родительским pom, либо в репозитории. Похоже, вы говорите, что хотите, чтобы кто-то извлек проект, который зависит от родителя, но не имел доступа к родителю и все же был в состоянии построить проект, который похож на попытку построить проект без его зависимостей.

Вы можете сделать доступным родительский пом:

  • Установите общедоступный репозиторий maven, разверните в нем родительский pom и поместите информацию о репозитории в дочерние poms.
  • Вы можете указать maven искать родительский pom по относительному пути, прежде чем он проверяет репозитории (это поможет вам, когда у вас есть локальные изменения в родительском pom, еще не развернутом). Таким образом, вы можете сделать svn: external или его эквивалент в вашем дочернем проекте вашему родительскому pom.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...