打包jar无效 聚合项目需要将pom作为打包方式

57

我的项目有不同的模块。

  • 每个模块都有一个 pom.xml 文件,指定了 jar 打包。
  • 每个 pom 引用了共同的父模块。
  • 在父模块中也有一个 pom.xml,包含了所有的子模块。

当我尝试使用父模块的 pom.xml 进行打包时,会显示错误 - "Packaging jar is invalid Aggregator project need pom as packaging"。

我该怎么做才能从 Maven 中创建可执行的应用程序 jar 包?

2个回答

104

简而言之:如果您的父级聚合项目不包含源代码(这是一个好习惯),只需将以下内容添加到父级pom.xml文件中:

<modules> <!-- modules list --> </modules>
<packaging>pom</packaging>

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

  • 将此代码移动到一个新模块中(称之为commons
  • commons作为父项目的子模块
  • commons模块添加为所有需要它的其他模块的依赖项(可能是全部模块)
  • 在父POM文件中添加<packaging>pom</packaging>

19

Maven要求父项目的packaging必须是pom

你可以通过包含一堆插件执行并将它们附加到其后续生命周期阶段来使pom项目表现得像一个jar项目。但这并不是一个好的方法,相反以下是更好的方法。

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

你的最终交付成果由其他(jar)项目组成,即其他项目是最终交付项目的依赖项。你将每个其他项目都定义为dependency,以便使用你的最终交付的人知道需要获取哪些(传递的)依赖项。或者最终交付jar可以被打包成"uber-jar",从而包含所有它的依赖项。这真的取决于最终交付的使用方式。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接