Нужен ли тип упаковки «pom», когда не используется агрегация проектов (многомодульная)? - PullRequest
13 голосов
/ 03 февраля 2010

Я хочу наследовать зависимости (родителя) pom.xml в дочернем проекте в Maven 2.2.1; то есть использовать наследование проекта. Похоже, в этом случае необходимо изменить тип упаковки по умолчанию с jar на pom.

Однако, разве в документации Maven2 не указано, что тип упаковки pom необходим для агрегации проектов, то есть многомодульных проектов, которые используют подмодули, но не для наследования проектов?

<project>
 <modelVersion>4.0.0</modelVersion>
 <groupId>example</groupId>
 <artifactId>example-parent</artifactId>
 <version>1</version>

 <dependencies>
   <dependency>
     <groupId>log4j</groupId>
     <artifactId>log4j</artifactId>
     <version>1.2.14</version>
   </dependency>
 </dependencies>
</project>

<project>     
 <parent>
   <groupId>example</groupId>
   <artifactId>example-parent</artifactId>
   <version>1</version>
 </parent>

 <modelVersion>4.0.0</modelVersion>
 <groupId>example</groupId> 
 <artifactId>example-child</artifactId>
</project>

Но если вы позвоните в Maven (например, mvn clean) с вышеуказанной конфигурацией, вы получите ошибку:

Project ID: example:example-child

Reason: Parent: example:example-parent:jar:1 
 of project: example:example-child has wrong packaging: jar.
Must be 'pom'. for project example:example-child

С другой стороны, со следующей записью:

<project> 
 ... 
 <packaging>pom</packaging>
 ... 
</project>

в родительском pom.xml, Maven может быть выполнен без ошибок.

Правильно ли это поведение Maven?

Ответы [ 3 ]

11 голосов
/ 03 февраля 2010

Как указано в разделе Наследование в справочнике POM :

Тип упаковки должен быть pom для родительских и агрегации (многомодульных) проектов.

Так что поведение Maven мне кажется правильным (и сообщение об ошибке само по себе понятно).

2 голосов
/ 30 сентября 2011

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

Для ясности, вы наследуете зависимости всех ваших зависимостей (транзитивные зависимости).

0 голосов
/ 03 февраля 2010

Как отметил Паскаль, поведение правильное.

Если вы все еще ищете средства для совместного использования зависимостей между модулями, вы можете рассмотреть возможность объединения рассматриваемых зависимостей в pom, и тогда ваши модули будут зависеть от этой новой pom «зависимости».

Подробнее см. Maven Book Section 3.6.1 .

...