Подтвердить что ты не робот

Требуется ли тип упаковки "pom", когда не используется агрегация проекта (мультимодуль)?

Я хочу наследовать зависимости (родителя) 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?

4b9b3361

Ответ 1

Как описано в разделе Inheritance POM Reference:

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

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

Ответ 2

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

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

Ответ 3

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

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

Подробнее см. Раздел Maven Book 3.6.1.