包装罐无效 聚合器项目需要 pom 作为包装

2022-08-31 20:28:51

我的项目有不同的模块。

  • 每个模块都有一个 pom.xml它指定 jar 包装。
  • 每个 pom 都是指共同的父项。
  • 在父模块中,还有一个pom.xml它包括所有模块。

当我尝试使用父模块的pom.xml打包时,它显示错误 - “打包jar无效聚合器项目需要pom作为打包”。

我该怎么做才能从maven制作应用程序的可执行jar?


答案 1

简而言之:如果您的父聚合器项目不包含源代码(这是一种很好的做法),只需将其添加到父 pom 中.xml:

<packaging>pom</packaging>

如果父项目包含源代码,我强烈建议您:

  • 将此代码移动到新模块中(我们称之为commons)
  • 创建父项目的子模块commons
  • 将模块添加为需要它的所有其他模块(可能是所有模块)的依赖项commons
  • 添加父 pom.xml<packaging>pom</packaging>

答案 2

Maven 要求父级是 的。packagingpom

您可以通过包含一堆插件执行并将其附加到其后续生命周期阶段,使项目的行为就像一个项目一样。这不是一条快乐的道路。相反,以下是。pomjar

从面向对象的角度来看,你想要什么?你有一个对象是由一堆其他对象组成的,对吧?换句话说,组合,而不是继承。

您的最终交付是由其他()项目组成的,即其他项目是最终交付项目的依赖项。您将为每个项目定义其他项目,以便使用最终交付的任何人都知道要获取哪些(可传递的)依赖项。或者,最终的交付可以打包为uber-jar,从而包含其所有依赖项。这实际上取决于如何使用最终交付。jardependencyjar

同时以下两个方面(可能)仍然存在:

  • 父项目(与最终交付项目不同,实际上它也可能是最终交付项目的父项目)定义了其后续子项目之间的共性,这是您应该从继承中获得的期望。子项目是通过其 POM 中的配置引用父项的任何项目。parent
  • 一个定义的项目,可以一次性轻松构建。模块是通过使用 引用的项目。这通常是(我猜>99%)在父项目中完成的,但不一定。你也可以把它放在最终的交付项目中(不影响继承,因为那是一个不同的野兽),但它是非典型的,我不会去那里。modulesmodules.module

推荐