在Maven多模型中,我们有一个父pom,其模块在<modules>
标签中定义,在每个模块中,我们定义父pom是谁。
为什么这种双向定义?
为什么不在模块的父部分中定义它们之间的关系?
如果模块总是绑定到父模块,我应该如何重用模块呢?
答案 0 :(得分:7)
为何选择这种方式?
不是强制性的。这是一个设计选择。
为什么不在父母中定义?
如果仅在父pom的modules
标记中定义它们,则只使用Maven的reactor / aggregation功能。
1)聚合(超级聚合器项目中的<modules>
声明)主要提供以下功能:
收集所有可用的模块
将项目排序为正确的构建顺序
按顺序构建选定的项目
通过声明要在父pom中聚合的模块来启用聚合模块:
<modules>
<module>my-child</module>
<module>my-other-child</module>
</modules>
但聚合不提供继承。
2)项目继承(子模块中的<parent>
声明)提供从父声明到子模块的多项内容的继承:
从实际文档中,父POM的大多数元素都是由子代继承的 :
的groupId
版本
描述
URL
inceptionYear
组织
许可证
开发
贡献者
MAILINGLISTS
SCM
issueManagement
ciManagement
属性
dependencyManagement
依赖
存储库
pluginRepositories
构建
带有匹配ID的插件执行
插件配置
报告
配置文件
通过在子poms中声明父工件来启用继承:
<parent>
<groupId>my-group</groupId>
<artifactId>my-parent</artifactId>
<version>1.0.0</version>
</parent>
<!-- You can note that groupId and version are not filled for the current project.
These are optional as inherited from the parent -->
<artifactId>my-artifact</artifactId>
实际上,您可以使用项目继承,项目组合,不使用它们或两者兼而有之
根据项目与要求之间的关系,这是一个真正的设计选择。
您可以参考this interesting point on the Maven documentation了解这两个功能:
项目继承与项目聚合
如果你有几个Maven项目,它们都有相似之处 配置,你可以通过拉出那些来重构你的项目 类似的配置和制作父项目。所以,你拥有的一切 要做的是让你的Maven项目继承那个父项目,和 然后,这些配置将应用于所有配置。
如果您有一组构建或处理的项目 在一起,您可以创建父项目并拥有该父项目 将这些项目声明为其模块。通过这样做,你只需要 建立父母,其余的将跟随。
但当然,你可以拥有Project Inheritance和Project 聚合即可。意思是,您可以让您的模块指定父级 项目,同时让那个父项目指定那些项目 Maven项目作为其模块。
答案 1 :(得分:1)
因为当你构建一些子模块时,它现在应该有一些元信息,例如依赖版本,并且将这个依赖项放入父pom dependencyManagement
通常是更好的做法,因为我会使所有子模块都使用相同的库版本。还有另一个可能有用的元信息,如properties
。
所以,总而言之,当你构建一个特殊的子模块时,mavben应该知道你通常在父pom中设置的一些信息。
我相信可以有更多理由,但这对我来说最明显。
如果您想在我看来重复使用模块,那么您需要将这些模块作为库,并通过dependency
标记添加它们作为库。