inheritance - Maven 继承和聚合示例架构

标签 inheritance maven parent aggregation pom.xml

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

设置场景:

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

  • 这三个项目都有一些共同的基本依赖项,例如 log4j 和 junit。除此之外,web-app1 和 web-app2 依赖于 project-api,并且它们之间还共享许多额外的公共(public)依赖项。

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

    遗产:

    创建一个组织级别的父 POM 是否有意义,该 POM 包含所有三个项目共有的依赖项(依赖项管理)以及一些环境设置和总体项目信息。意图是所有 Maven 项目(不一定直接)从这个 POM 继承。

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

    聚合:

    在聚合方面,我不想在一天结束时创建单个 Artifact 。相反,我想运行一个 Maven 构建命令(可能在组织 POM 级别)以按以下顺序构建三个项目:
  • 项目API
  • 网络应用程序1
  • 网络应用程序2

  • 这是否意味着组织父 POM 将声明模块:
  • 项目API
  • 网络应用父 POM

  • 并且 web-app 父 POM 将声明模块:
  • 网络应用程序1
  • 网络应用程序2

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

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

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

    最佳答案

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

    组织级POM

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

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

    如果他们有重复的插件、配置等,拥有一个 webapp-parent 是一个好主意。如果他们共享代码,你可以添加另一个项目 webapp-common ,它是一个构建为其他两个可以依赖的 jar 的项目。它的依赖项将被传递包含,因此这是常见依赖项的自然位置。

    聚合

    webapp-parent 不需要同时是 parent 和 aggregator,除非您需要经常构建 webapp1 和 webapp2 而不是同时构建 project-api。您可以将所有项目作为整体父级的模块。您的目录结构可能看起来像

    overall
      project-api
      webapp-parent
      webapp1
      webapp2
    

    或者如果你更喜欢你原来的建议,这也很好
    overall
      project-api
      webapp-parent
        webapp1
        webapp2
    

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

    build 顺序

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

    关于inheritance - Maven 继承和聚合示例架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846426/

    相关文章:

    jQuery - 切换父元素的类?

    java - 如何将 List<实现接口(interface)的对象> 传递给方法?

    java - 如何在 izpack-maven-plugin install.xml 中使用 Maven 项目属性?

    java - Maven - 包不存在

    同一数据集中具有父子关系的 JQuery 数据表。如何将其显示为表中的父子行?

    javascript - 如何更改父级的背景颜色?

    java - "Dynamic"Java 中的转换

    c++ - 私有(private)继承的 typedef 对嵌套类的可见性

    C++调用父函数仅在使用指针时有效

    unit-testing - maven::在多模块项目中仅运行单个测试