Maven 多模块项目(Multi-module Project)是指一个父项目(parent project)包含多个子模块(submodules)的项目结构。这种结构允许我们将一个大型项目拆分成多个逻辑上独立但又相互关联的模块,每个模块可以单独构建,也可以作为整体一起构建。

多模块项目的优势

  • 代码复用 :公共代码可以提取到单独的模块中供其他模块使用
  • 职责分离 :不同团队可以专注于不同模块的开发
  • 构建效率 :只构建发生变化的模块,减少构建时间
  • 依赖管理 :统一管理所有模块的依赖关系
  • 版本控制 :所有模块使用统一的版本号,便于管理
    • 大型项目分层(如 web service dao

    • 微服务架构(每个服务一个模块)

    • 共享通用代码(如 common 模块)

    标准目录结构

    parent-project/          # 父项目根目录
    ├── pom.xml             # 父POM(packaging=pom)
    ├── module-a/           # 子模块A
    │   ├── src/
    │   └── pom.xml         # 子模块A的POM
    ├── module-b/           # 子模块B
    │   ├── src/
    │   └── pom.xml         # 子模块B的POM
    └── module-web/         # Web模块
        ├── src/
        └── pom.xml

    关键特征:

    1. 父POM

      • 必须设置 <packaging>pom</packaging>

      • 通过 <modules> 管理子模块

    2. 子模块

      • 通过 <parent> 继承父POM

      • 可以有自己的依赖和构建配置

    创建 Maven 多模块项目

    1. 创建父项目

    父项目本身通常不包含任何代码,它主要用来管理子模块和公共配置。

    创建父项目的 pom.xml 文件需要设置 packaging 为 pom:

    <project >
    <modelVersion > 4.0.0 </modelVersion >
    <groupId > com.example </groupId >
    <artifactId > parent-project </artifactId >
    <version > 1.0.0 </version >
    <packaging > pom </packaging >
    <modules >
    <module > module1 </module >
    <module > module2 </module >
    </modules >
    </project >

    2. 创建子模块

    子模块是实际的代码模块,可以是普通的 Java 项目、Web 应用等。每个子模块都有自己的 pom.xml 文件,但需要声明父项目:

    <project >
    <parent >
    <groupId > com.example </groupId >
    <artifactId > parent-project </artifactId >
    <version > 1.0.0 </version >
    </parent >
    <modelVersion > 4.0.0 </modelVersion >
    <artifactId > module1 </artifactId >
    </project >
    <groupId > com.example </groupId >
    <artifactId > module1 </artifactId >
    <version > ${project.version} </version >
    </dependency >
    </dependencies >
    </project >

    父项目可以定义公共依赖,子模块会自动继承这些依赖:

    <project >
    <!-- 父项目 pom.xml -->
    <dependencyManagement >
    <dependencies >
    <dependency >
    <groupId > junit </groupId >
    <artifactId > junit </artifactId >
    <version > 4.12 </version >
    <scope > test </scope >
    </dependency >
    </dependencies >
    </dependencyManagement >
    </project >

    子模块只需声明依赖的 groupId 和 artifactId,无需指定版本:

    <project >
    <!-- 子模块 pom.xml -->
    <dependencies >
    <dependency >
    <groupId > junit </groupId >
    <artifactId > junit </artifactId >
    </dependency >
    </dependencies >
    </project >