我有一个问题,关于如何最好地使用继承和聚合的组合重新构建多个单独的 Maven 项目。
设置场景:
这三个项目都有一些共同的基本依赖项,例如 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 级别)以按以下顺序构建三个项目:
这是否意味着组织父 POM 将声明模块:
并且 web-app 父 POM 将声明模块:
注意 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/