Отсутствует артефакт при создании дочернего проекта с Maven 2 - PullRequest
4 голосов
/ 04 сентября 2010

У меня есть родительский проект с 5 детьми, у которых также есть зависимости друг от друга.Я использовал как наследование с элементом <parent> в дочернем pom.xml, так и агрегацию с элементом <module> в родительском.

Мой родительский пом выглядит так:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.domain</groupId>
<artifactId>Parent</artifactId>
<packaging>pom</packaging>
<version>RELEASE</version>
<name>Parent</name>

<modules>
    <module>../Child1</module>
    <module>../Child2</module>
    <module>../Child3</module>
    <module>../Child4</module>
    <module>../Child5</module>
</modules>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.domain</groupId>
            <artifactId>Child1</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.domain</groupId>
            <artifactId>Child2</artifactId>
            <version>RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>
</project>

Child3 pomвыглядит так:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.domain</groupId>
<artifactId>Child3</artifactId>
<name>Child3</name>
<packaging>war</packaging>

<parent>
    <artifactId>Parent</artifactId>
    <groupId>com.domain</groupId>
    <version>RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>com.domain</groupId>
        <artifactId>Child1</artifactId>
    </dependency>
    <dependency>
        <groupId>com.domain</groupId>
        <artifactId>Child2</artifactId>
    </dependency>
</dependencies>
</project>

Все работает нормально, когда я запускаю mvn install на Parent или Child1.Но когда я запускаю его на Child3, я получаю следующие ошибки:

[INFO] Failed to resolve artifact.
Missing:
----------
1) com.domain:Child1:jar:RELEASE
...
2) com.domain:Child2:jar:RELEASE

Что не так с моей настройкой?

1 Ответ

6 голосов
/ 04 сентября 2010

На самом деле я не буду пытаться решить проблему вашего текущего подхода, а скорее расскажу о том, что я считаю лучшей практикой в ​​этом случае.Не стесняйтесь принять его или нет:)

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

Итак, используйте версию SNAPSHOT, есливместо этого проект находится в активной разработке, т.е. измените родительский элемент следующим образом:

<project>

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.domain</groupId>
  <artifactId>Parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Parent</name>

  <modules>
    <module>../Child1</module>
    <module>../Child2</module>
    <module>../Child3</module>
    <module>../Child4</module>
    <module>../Child5</module>
  </modules>

</project>

Обратите внимание, что я удалил элемент dependencyManagement, я не думаю, что он обеспечивает большую добавленную стоимость для internal зависимости многомодульной сборки и рекомендовать использовать встроенные свойства ${project.groupId} и ${project.version} вместо их объявления:

<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <artifactId>Parent</artifactId>
    <groupId>com.domain</groupId>
    <version>1.0-SNAPSHOT</version><!-- must hard code this -->
  </parent>

  <!--groupId>com.domain</groupId--><!-- you can skip this, you inherit it -->
  <artifactId>Child3</artifactId>
  <packaging>war</packaging>

  <name>Child3</name>

  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>Child1</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>Child2</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</project>

Как я уже писал, я не думаю, что dependencyManagementдействительно полезен для внутренних зависимостей, и именно так я настраиваю свои проекты.Но вы можете, если хотите.Просто используйте свойства, чтобы не повторять информацию.

...