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

时间:2012-01-13 05:39:55

标签: inheritance maven parent aggregation pom.xml

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

设置场景:

  • 现有3个基于代码的Maven项目均由同一团队开发。
  • 1个项目是一个API,让我们调用是project-api。
  • 其他2个项目是使用project-api的网络应用程序。让我们称他们为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。

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

聚合:

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

  1. 项目-API
  2. web的APP1
  3. web的APP2
  4. 这是否意味着组织父POM会声明模块:

    1. 项目-API
    2. web-app parent POM
    3. 网络应用程序父POM将声明模块:

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

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

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

1 个答案:

答案 0 :(得分:12)

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

组织级别POM

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

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

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

聚合

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

overall
  project-api
  webapp-parent
  webapp1
  webapp2

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

overall
  project-api
  webapp-parent
    webapp1
    webapp2

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

构建订单

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