Skip to content

模块聚合

模块聚合主要用于快速构建项目

Maven 的 聚合是通过 <modules> 标签实现的。父 POM 可以包含多个模块,执行父 POM 的构建命令,会自动构建所有模块。

创建多模块聚合项目

<modules>中的值是子模块的相对路径。

假设存在:

project-root
 ├── module-a
 ├── module-b
 └── module-c

你可以在根目录创建一个 pom.xml

pom.xml
xml
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>project-root</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>

  <modules>
    <module>module-a</module>
    <module>module-b</module>
    <module>module-c</module>
  </modules>
</project>

如果子模块不在同一目录下:

xml
projects/
├─ parent-project/
│   └─ pom.xml        <- 父 POM
├─ common-modules/
│   └─ module-a/
│       └─ pom.xml    <- 子模块
└─ other-modules/
    └─ module-b/
        └─ pom.xml    <- 子模块

父 POM parent-project/pom.xml<modules> 可以写:

xml
<modules>
    <module>../common-modules/module-a</module>
    <module>../other-modules/module-b</module>
</modules>

警告

多模块项目中,如果模块之间存在依赖关系,还是需要将模块作为依赖引入。

例如service模块中需要使用dao模块的Student,则需要在service模块中引入dao模块:

pom.xml
xml
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>dao</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

优势

如果是单模块项目,模块更新后,需要我们手动install到本地仓库,依赖他的项目才能够更新。

多模块聚合项目会帮助我们自动构建。

依赖版本控制

父 POM 常用于依赖版本的管理。可以在父 POM 使用<dependencyManagement>

多模块项目一般遵循 父模块统一管理 + 子模块按需扩展 的原则。

  • 父模块中会指定模块的默认版本,这并不会实际引入依赖。
pom.xml
xml
<dependencyManagement>
  <dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.42</version>
    </dependency>
  </dependencies>
</dependencyManagement>
  • 子模块的pom.xml中引入依赖才是真正的引入。如果不指定版本将使用父模块中指定的默认版本,即1.18.42
xml
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>
  • 子模块也可以根据需要,自定义需要使用的依赖版本
xml
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
      <version>1.6.0</version>
    </dependency>
</dependencies>

为什么要父项目去控制依赖的版本?

依赖之间经常会存在冲突,版本的指定是一个很头疼的事,将版本控制这个职责交给父模块,可以让子模块只专注于业务。父模块就像一个版本控制中心。spirngboot就是这个思想

image-20260308175313141