Maven: добавление ссылки на родительский проект pom

Я не уверен, правильно ли я понимаю, как правильно использовать проект родительского пом. У меня установлен следующий родительский pom:

<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>../child1</module>
    <module>../child2</module>
</modules>

И затем дети pom ссылаются на родителя (каждый ребенок имеет свой собственный набор зависимостей, которые не показаны):

<parent>
    <groupId>com.example</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../Parent/pom.xml</relativePath>
</parent>

<modelVersion>4.0.0</modelVersion>
<artifactId>child1</artifactId>

Эта настройка работает нормально и правильно разрешается в eclipse (m2eclipse). Я могу развернуть их в моем локальном репозитории и получить следующую структуру, которая должна быть правильной:

--com
   --example
      --parent
        --0.0.1-SNAPSHOT
          --parent-0.0.1-SNAPSHOT.pom
      --child1
        --0.0.1-SNAPSHOT
          --child1-0.0.1-SNAPSHOT.jar
          --child1-0.0.1-SNAPSHOT.pom
      --child2
        --0.0.1-SNAPSHOT
          --child2-0.0.1-SNAPSHOT.jar
          --child2-0.0.1-SNAPSHOT.pom

Моя проблема в том, что теперь я хочу ссылаться на проект родительский в проекте другой (не parent, child1 или child2) и, таким образом, вытащить все родительские дети. Я могу добавить ссылку на него в другом проекте:

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
    </dependency>
</dependencies>

При этом проект не показывает ошибок в eclipse, но в мой путь к классам не добавляются артефакты: not child1, child2 или любая их зависимость.

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

Ответ 1

Первое, что я хотел бы предложить изменить структуру проектов.

--com
   --example
      --parent
        --0.0.1-SNAPSHOT
          --parent-0.0.1-SNAPSHOT.pom
      --child1
        --0.0.1-SNAPSHOT
          --child1-0.0.1-SNAPSHOT.jar
          --child1-0.0.1-SNAPSHOT.pom
      --child2
        --0.0.1-SNAPSHOT
          --child2-0.0.1-SNAPSHOT.jar
          --child2-0.0.1-SNAPSHOT.pom

Я предлагаю пойти следующим образом:

  --parent (pom.xml)
      +--child1
      +--child2

Родитель может быть включен в управление версиями (Git, SVN) либо в мастер, либо в магистраль. Кроме того, все дочерние элементы должны ссылаться на родителя следующим образом:

<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>com.example</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>child1</artifactId>

и в вашем родителе вы можете использовать такие вещи:

<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>child1</module>
    <module>child2</module>
</modules>

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

<parent>
    <groupId>com.example</groupId>
    <artifactId>master-pom</artifactId>
    <version>0.0.1</version>
</parent>

<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>child1</module>
    <module>child2</module>
</modules>

В компании pom вы можете (и должны) подключать разные версии плагинов и определять дефолты и предложения компаний для зависимостей с их соответствующими версиями.

Если вам нравится иметь компанию super-pom, вы просто создаете отдельный проект maven, который содержит только файл pom, который содержит ваши конфигурации, такие как плагины, зависимости и т.д. и, конечно же, проверяет его на управление версиями (Git, SVN и т.д..). отдельно от другого проекта.

Если вы хотите ссылаться на файл jar, что означает, другими словами, артефакт вашей многомодульной сборки, вы должны использовать правильный файл groupId, artifactId и версию. Если вам нравится использовать child1 в другом проекте, вам необходимо указать следующее:

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>child1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

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

Update: Вы можете сделать это ограниченным образом только для области dependencyManagement с scope import, но это предназначено только для использования в depdencyManagement и а не для зависимостей. Другое решение может заключаться в создании отдельного фиктивного проекта, в котором также имеются зависимости от двух дочерних элементов как транзитивные отпечатки. Но это не красота.

Таким образом, решение состоит в том, чтобы просто добавить две или более зависимостей, которые вы используете в проекте, и что это.

Ответ 2

Попробуйте создать супер-помп с одинаковым типом упаковки и добавьте текущий родитель в зависимость.

Ответ 3

Как отметил @khmarbaise, родительский сборник с несколькими модулями обычно не используется в качестве зависимости в другом месте.

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