Maven继承和聚合示例体系结构

问题描述 投票:14回答:1

我有一个问题,关于如何使用继承和聚合的组合来重新构建一些单独的Maven项目。

设置场景:

  • 现有3个基于代码的Maven项目均由同一团队开发。
  • 1项目是一个API,让我们调用project-api。
  • 其他2个项目是使用project-api的web应用程序。让我们称他们为web-app1和web-app2。

这三个项目都有一些基本的依赖关系,比如log4j和junit。除此之外,web-app1和web-app2依赖于project-api,并且还在它们之间共享许多其他常见的依赖关系。

我一直在阅读https://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html,我只是想确认我理解最佳实践。

遗产:

我是否有必要创建一个组织级父POM,其中包括所有三个项目和一些环境设置以及总体项目信息共有的依赖关系(依赖关系管理)。意图是所有Maven项目(不一定直接)继承自此POM。

我是否有必要创建另一个父POM,其中包含web-app1和web-app2共有的依赖关系(依赖关系管理),并且只有web-app1和web-app2继承自此POM。我认为这个POM(我们称之为web-app父POM)应该是组织级父POM的子POM。

聚合:

在聚合方面,我不想在一天结束时创建一个工件。相反,我想运行一个Maven构建命令(可能在组织POM级别)以此顺序构建三个项目:

  1. 项目的API
  2. 网络APP1
  3. 网络APP2

这是否意味着组织父POM将声明模块:

  1. 项目的API
  2. 网络应用程序父POM

Web应用程序父POM将声明模块:

  1. 网络APP1
  2. 网络APP2

请注意,Web-app父POM和组织父POM没有任何相关代码。我相信这是可以注意到的“事实上,在Maven世界中,一个项目根本不需要包含任何代码,只需要一个pom.xml。”取自http://maven.apache.org/pom.html

最后,我如何确保我需要的构建顺序得到尊重?例如。构建组织父POM会导致构建project-api,并且这个最新的构建用于构建web-app1和web-app2?

我希望这不会太令人困惑,很高兴澄清是否需要更多信息。如果我完全错了,请随时告诉我!谢谢。

inheritance maven parent aggregation pom.xml
1个回答
12
投票

你的方法是明智的。几点:

组织层面的POM

是环境设置和总体项目信息,不是依赖项。

项目应明确列出所有依赖项,而不是依赖继承它们(恕我直言)。这意味着您必须多次声明您的记录器,但它会在以后节省您的痛苦。 (当然,您可以使用单独的POM项目将相关的依赖项组合在一起,因此通常一起指定,例如链接中的hibernate示例)。如果要集中依赖项的版本,可以在父POM中放置dependencyManagement部分,这意味着您仍然在子项目中声明依赖项,但版本来自父项,从而确保一致性。没有声明依赖关系的孩子根本不会结束它。

拥有webapp-parent是一个好主意,如果他们有重复的插件,配置等。如果他们共享代码,你可以添加另一个项目webapp-common,它是一个内置的jar,其他两个可以依赖。它的依赖关系将被传递,因此这是共同依赖关系的自然发生地。

聚合

webapp-parent不需要同时是父和聚合器,除非您需要经常同时构建webapp1和webapp2而不是project-api。您可以将所有项目作为整体父项的模块。您的目录结构可能如下所示

overall
  project-api
  webapp-parent
  webapp1
  webapp2

或者如果你更喜欢你的原始建议,这也没关系

overall
  project-api
  webapp-parent
    webapp1
    webapp2

随着时间的推移,密切关注项目布局更重要,并在适当的时候进行重构。

建立订单

只要您声明依赖项,Maven就足够聪明,可以按正确的顺序构建模块。

© www.soinside.com 2019 - 2024. All rights reserved.