49

我的项目有不同的模块。

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

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

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

4

2 回答 2

79

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

<packaging>pom</packaging>

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

  • 将此代码移动到新模块中(我们称之为commons
  • 制作commons父项目的子模块
  • 将模块添加commons为所有其他需要它的模块的依赖项(可能全部)
  • 添加<packaging>pom</packaging>父 pom.xml
于 2013-09-11T07:52:59.400 回答
17

Maven 要求父级是packaging pom.

您可以通过包含一堆插件执行并将它们附加到它们的后续生命周期阶段来使pom项目表现得像一个项目。jar这不是一条快乐的道路。反之,则如下

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

您的最终交付由其他 ( jar) 项目组成,即其他项目是最终交付项目的依赖项。您将分别定义其他项目,dependency以便使用您最终交付的任何人都知道要获得什么(传递)依赖项。或者,最终交付jar可以打包为“uber- jar,从而包含其所有依赖项。这一切都取决于最终交付的使用方式。

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

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