正确使用多模块maven项目的方法

时间:2017-08-06 13:36:54

标签: java maven maven-module

在Maven多模型中,我们有一个父pom,其模块在<modules>标签中定义,在每个模块中,我们定义父pom是谁。

为什么这种双向定义?
为什么不在模块的父部分中定义它们之间的关系?
如果模块总是绑定到父模块,我应该如何重用模块呢?

2 个答案:

答案 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标记添加它们作为库。