Упаковочная банка недействительна. Проект агрегатора нужен пом в качестве упаковки

  • В моем проекте у меня разные модули.
  • Каждый модуль имеет pom.xml, в котором упаковка является банкой.
  • И каждый pom относится к общему родителю.
  • В родительском модуле есть также pom.xml, который включает в себя все модули.

    Но когда я попытался сделать упаковку в pom.xml родительского модуля, он показывает ошибку "Ошибка упаковки". Проект агрегатора нужен pom как упаковка ".

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

Ответ 1

Чтобы сделать вещи короткими: если в проекте родительского агрегатора нет исходного кода (и это хорошая практика), просто добавьте это в свой родительский pom.xml:

<packaging>pom</packaging>

Если родительский проект содержит исходный код, я настоятельно рекомендую вам:

  • переместите этот код в новый модуль (позвоните ему commons)
  • make commons дочерний модуль вашего родительского проекта
  • добавить модуль commons в качестве зависимости от всех других модулей, требующих его (возможно, всех)
  • добавить <packaging>pom</packaging> в родительский pom.xml

Ответ 2

Maven требует, чтобы родительский элемент был packaging pom.

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

С объектно-ориентированной точки зрения, что вам нужно? У вас есть один объект, состоящий из кучи других объектов, не так ли? Другими словами, состав, в отличие от наследования.

Ваша окончательная поставка составлена ​​из других (jar) проектов, то есть другие проекты зависят от проекта окончательной доставки. Вы определяете другие проекты как dependency, чтобы каждый, кто использует вашу окончательную поставку, знал, какие (транзитивные) зависимости получить. В качестве альтернативы окончательная поставка jar может быть упакована как "uber- jar" и, следовательно, содержать все ее зависимости. Это действительно зависит от того, как будет использоваться окончательная поставка.

В то же время могут существовать следующие два аспекта (возможно):

  • Родительский проект (который отличается от проекта окончательной доставки, на самом деле он также может быть родителем проекта окончательной доставки) определяет общие черты между его последующими дочерними элементами, как и следовало ожидать от наследования. Ребенок - это любой проект, который ссылается на родителя через конфигурацию parent в POM.
  • Проект, который определяет modules, который должен быть легко построен за один раз. Модули - это проекты, на которые ссылается использование modules.module. Обычно это (я думаю, > 99%) выполняется в родительском проекте, но не обязательно. Вы также можете добавить его в окончательный проект доставки (не влияя на наследование, потому что это, таким образом, другой зверь), но он атипичный, и я бы туда не поехал.