我有一个问题,关于如何使用继承和聚合的组合来重新构建一些单独的Maven项目。
设置场景:
这三个项目都有一些基本的依赖关系,比如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级别)按此顺序构建三个项目:
这是否意味着组织父POM会声明模块:
网络应用程序父POM将声明模块:
请注意,网络应用程序父POM和组织父POM没有任何相关代码。我相信这是可以注意到的“事实上,在Maven世界中,一个项目根本不需要包含任何代码,只需要一个pom.xml。”取自http://maven.apache.org/pom.html。
最后,我如何确保我需要的构建顺序得到尊重?例如。构建组织父POM会导致构建project-api并且这个最新版本用于构建web-app1和web-app2?
我希望这不会太令人困惑,很高兴澄清是否需要更多信息。如果我完全错了,请随时告诉我!感谢。
答案 0 :(得分:12)
你的方法是明智的。几点:
是环境设置和总体项目信息,不是依赖项。
项目应明确列出所有依赖项,而不是依赖于继承它们(恕我直言)。这意味着您必须多次声明您的记录器,但它会在以后节省您的痛苦。 (当然,您可以使用单独的POM项目将相关的依赖项组合在一起,因此通常一起指定,例如链接中的hibernate示例)。如果要集中依赖项的版本,可以在父POM中放置一个dependencyManagement
部分,这意味着您仍然在子项目中声明了依赖项,但该版本来自父项目,从而确保一致性。没有声明依赖关系的孩子根本不会最终得到它。
拥有webapp-parent是一个好主意,如果他们有重复的插件,配置等。如果他们共享代码,你可以添加另一个项目webapp-common,它是一个内置为jar的另一个两个可以依赖。它的依赖关系将被传递,因此这是共同依赖的自然场所。
overall
project-api
webapp-parent
webapp1
webapp2
或者如果你更喜欢你的原始建议,这也没关系
overall
project-api
webapp-parent
webapp1
webapp2
随着时间的推移,密切关注项目布局,并在适当的时候进行重构,这一点更为重要。
Maven足够聪明,只要您声明依赖项,就能以正确的顺序构建模块。