maven工程结构分为继承和集合,通过继承可以让多个子模块共享配置在父模块中的配置信息,通过集合可以让我们在父模块执行命令时,递归的对子模块进行相同的处理。
下面以模块com.mycompany.app:my-app:1
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>
和模块com.mycompany.app:my-module:1 为例来进行说明
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
-
继承,通过在子模块中指定<parent> 元素来实现
-
场景1:子模块所在的目录是父模块的子目录
.
|-- my-module
| `-- pom.xml
`-- pom.xml
- 其中
my-module/pom.xml 是com.mycompany.app:my-module:1 的POM,pom.xml 是com.mycompany.app:my-app:1 的POM
为了把my-app 变成my-module 的父模块,可按如下修改my-module/pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<artifactId>my-module</artifactId>
</project>
- 在子模块中追加了
<parent> 元素
- 去除了
my-module/pom.xml 中的<groupId> 和<version> ,默认使用从父模块继承到的属性值
-
场景2: 子模块所在目录不是父模块的子目录
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
- 其中
parent/pom.xml 是com.mycompany.app:my-app:1 的POM,这个例子也告诉我们工程目录名parent 和artifactId 的值可以不一样,但在实际应用中,我们一般会保持目录名和artifactId 一致,这里只是为了说明my-app 是父模块
为了把my-app 变成my-module 的父模块,可按如下修改my-module/pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
- 在
<parent> 元素中追加<relativePath> ,相对路径的起始目录是当前子模块的路径
-
场景3: 父工程在镜像仓库中
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>my-module</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
通过继承,子模块可以从父模块继承到如下元素
groupId
version
description
url
inceptionYear
organization
licenses
developers
contributors
mailingLists
scm
issueManagement
ciManagement
properties
dependencyManagement
dependencies
repositories
pluginRepositories
build
plugin executions with matching ids
plugin configuration
etc.
reporting
profiles
-
聚集,通过在父模块中指定<modules>
一个模块设定到父模块的<modules> 后,当在父模块执行maven命令时,将在所有子模块中递归执行
通过以下两步可以将子模块聚集到父模块中
- 将父模块
pom.xml 中的<packaging> 属性值设置成pom
- 在父模块中的
<modules> 元素中指定子模块的路径
-
场景1:子模块所在的目录是父模块的子目录
.
|-- my-module
| `-- pom.xml
`-- pom.xml
- 其中
my-module/pom.xml 是com.mycompany.app:my-module:1 的POM,pom.xml 是com.mycompany.app:my-app:1 的POM
为了把my-module 聚集到my-app 模块下,可按如下修改my-app/pom.xml 文件
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>my-module</module>
</modules>
</project>
- 追加
<packaging>pom</packaging> ,默认是jar
- 追加
<modules> ,其中<module> 中指定子模块的目录位置,是一个相对路径,起始路径是父模块的目录
-
场景2:子模块所在的目录不是父模块的子目录
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
- 其中
parent/pom.xml 是com.mycompany.app:my-app:1 的POM
通过相对路径把把my-module 聚集到my-app 模块下
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
</project>
-
继承 VS 聚集
当有多个maven工程,如果想实现所有工程共享一些配置信息,可以采用 继承 的模式,把公共信息配置到一个工程里,再把其他的工程中的<parent> 指向这个工程。
如果想实现对一批maven工程,同时进行编译、发布等操作,可以采用 聚集 的模式,创建一个parent工程,把这一批工程都作为parent工程的<modules> ,这样我们对父工程进行操作时,就可以递归的对所有module进行处理。
当然我们也可以同时使用继承 和 聚集,即在子模块中指定<parent> ,同时也在父模块中指定<modules>
按如下模块路径举例:
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
my-module/pom.xml 是com.mycompany.app:my-module:1 的POM
parent/pom.xml 是com.mycompany.app:my-app:1 的POM
此时,为了同时利用继承和聚集,可做如下修改
com.mycompany.app:my-app:1 的POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
</project>
com.mycompany.app:my-module:1 的POM
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
|