全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-23 15 分钟 ✍️ juanwangdev

多模块项目结构设计

大型项目通常包含多个子系统或组件,如果所有代码放在一个项目中,会导致项目臃肿、构建缓慢、依赖混乱、职责不清等问题。Maven 的多模块机制将项目拆分为多个独立模块,每个模块有独立的 pom.xml,通过父 POM统一管理,实现代码复用、职责分离、并行构建。

为什么需要多模块

单模块项目的问题

XML
场景:电商系统

单模块项目结构:
ecommerce/
├── src/main/java/
│   └── com/example/
│       ├── controller/     ← Web层
│       ├── service/        ← 业务层
│       ├── dao/            ← 数据层
│       ├── model/          ← 实体类
│       ├── util/           ← 工具类
│       └── config/         ← 配置类
│       └── api/            ← API定义
│       └── admin/          ← 管理后台
│       └── mobile/         ← 移动端
└── pom.xml                 ← 一个巨大的pom.xml

问题:

1. 项目臃肿
   - 几百个源文件
   - 目录层级混乱
   - IDE 加载慢

2. 构建缓慢
   - 修改一个文件,整个项目重新编译
   - mvn package 需要10分钟

3. 依赖混乱
   - 所有代码共享依赖
   - Web层依赖了DAO层不需要的库
   - 移动端依赖了管理后台的库

4. 职责不清
   - controller、service、dao混在一起
   - 新人不知道代码在哪

5. 团队协作困难
   - 多人修改同一pom.xml,容易冲突
   - 不同团队职责交叉

6. 部署困难
   - 只能打包成一个巨大的 jar
   - 无法单独部署某个子系统

多模块项目的优势

XML
多模块项目结构:
ecommerce/
├── pom.xml                 ← 父 POM
├── ecommerce-common/       ← 公共模块
│   └── pom.xml
├── ecommerce-api/          ← API 模块
│   └── pom.xml
├── ecommerce-service/      ← 服务模块
│   └── pom.xml
├── ecommerce-web/          ← Web 模块
│   └── pom.xml
├── ecommerce-admin/        ← 管理后台
│   └── pom.xml
└── ecommerce-mobile/       ← 移动端
│   └── pom.xml

优势:

1. 项目清晰
   - 每个模块职责明确
   - 目录结构简单

2. 构建高效
   - 只构建修改的模块
   - 可并行构建多个模块
   - 构建时间从10分钟降到2分钟

3. 依赖清晰
   - 每个模块独立依赖
   - Web 只依赖 service
   - admin 不依赖 mobile 的库

4. 团队协作
   - 不同团队维护不同模块
   - pom.xml冲突减少

5. 独立部署
   - web.jar、admin.jar 分别部署
   - 可只升级某个模块

6. 代码复用
   - common 模块被所有模块依赖
   - 工具类统一管理

多模块项目结构设计

典型分层结构

XML
推荐的多模块分层结构:

┌─────────────────────────────────────────────┐
│               ecommerce-web                  │
│        (Web控制器、前端交互)                  │
└────────────────────┬────────────────────────┘
                     │ depends on
┌────────────────────▼────────────────────────┐
│              ecommerce-service               │
│          (业务逻辑、事务管理)                 │
└────────────────────┬────────────────────────┘
                     │ depends on
          ┌──────────┴──────────┐
          │                     │
┌─────────▼─────────┐ ┌─────────▼─────────┐
│   ecommerce-dao   │ │   ecommerce-api   │
│ (数据访问、ORM)   │ │ (接口定义、DTO)   │
└─────────┬─────────┘ └─────────┬─────────┘
          │                     │
          └──────────┬──────────┘
                     │ depends on
┌────────────────────▼────────────────────────┐
│              ecommerce-common                │
│      (工具类、常量、基础配置)                 │
└─────────────────────────────────────────────┘

依赖方向:从上到下,单向传递
- web 依赖 service
- service 依赖 dao、api
- dao、api 依赖 common
- common 不依赖任何模块

项目目录结构

XML
ecommerce/
├── pom.xml                      # 父 POM(聚合+继承)
├── ecommerce-common/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/example/common/
│       │   │       ├── util/
│       │   │       ├── constant/
│       │   │       └── exception/
│       │   └── resources/
│       └── test/
│           └── java/
├── ecommerce-api/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/example/api/
│                   ├── dto/
│                   ├── vo/
│                   └── facade/
├── ecommerce-dao/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/example/dao/
│           │       ├── entity/
│           │       ├── mapper/
│           │       └── repository/
│           └── resources/
│               └── mapper/       # MyBatis XML
├── ecommerce-service/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/example/service/
│           │       ├── impl/
│           │       ├── config/
│           │       └── aspect/
│           └── resources/
│               └── application.yml
├── ecommerce-web/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/example/web/
│           │       ├── controller/
│           │       ├── filter/
│           │       └── interceptor/
│           └── resources/
│               └── static/
│               └── templates/
└── ecommerce-admin/
    ├── pom.xml
    └── src/
        └── main/
            └── java/
                └── com/example/admin/
                    └── controller/

父 POM 配置详解

父 POM 的作用

XML
父 POM 承担两个角色:

1. 聚合(Aggregator)
   - 定义所有子模块
   -统一构建所有模块
   - 管理构建顺序

2. 继承(Parent)
   - 定义公共配置
   - 统一依赖版本(dependencyManagement)
   - 统一插件配置(pluginManagement)
   - 子模块继承配置

父 POM 完整示例

XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <!-- ==================== 项目坐标 ==================== -->
  <groupId>com.example</groupId>
  <artifactId>ecommerce</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>  <!-- 父模块必须是 pom -->

  <!-- ==================== 项目信息 ==================== -->
  <name>Ecommerce Platform</name>
  <description>电商系统多模块项目</description>

  <!-- ==================== 子模块列表 ==================== -->
  <!-- 聚合:定义所有子模块 -->
  <modules>
    <!-- 模块顺序不影响构建顺序 -->
    <!-- Maven 自动根据依赖关系决定构建顺序 -->
    <module>ecommerce-common</module>
    <module>ecommerce-api</module>
    <module>ecommerce-dao</module>
    <module>ecommerce-service</module>
    <module>ecommerce-web</module>
    <module>ecommerce-admin</module>
  </modules>

  <!-- ==================== 属性定义 ==================== -->
  <!-- 统一版本管理 -->
  <properties>
    <!-- Java版本 -->
    <java.version>17</java.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!-- Spring 版本 -->
    <spring.version>5.3.20</spring.version>
    <spring-boot.version>2.7.0</spring-boot.version>

    <!-- 数据库相关 -->
    <mybatis.version>3.5.10</mybatis.version>
    <mybatis-spring.version>2.0.7</mybatis-spring.version>
    <mysql-connector.version>8.0.28</mysql-connector.version>

    <!-- 其他依赖 -->
    <junit.version>4.13.2</junit.version>
    <logback.version>1.2.11</logback.version>
    <commons-lang3.version>3.12.0</commons-lang3.version>

    <!-- 项目模块版本 -->
    <ecommerce.version>1.0.0</ecommerce.version>
  </properties>

  <!-- ==================== 依赖版本管理 ==================== -->
  <!-- 子模块引用时无需指定版本 -->
  <dependencyManagement>
    <dependencies>
      <!-- ========== 内部模块 ========== -->
      <dependency>
        <groupId>com.example</groupId>
        <artifactId>ecommerce-common</artifactId>
        <version>${ecommerce.version}</version>
      </dependency>
      <dependency>
        <groupId>com.example</groupId>
        <artifactId>ecommerce-api</artifactId>
        <version>${ecommerce.version}</version>
      </dependency>
      <dependency>
        <groupId>com.example</groupId>
        <artifactId>ecommerce-dao</artifactId>
        <version>${ecommerce.version}</version>
      </dependency>
      <dependency>
        <groupId>com.example</groupId>
        <artifactId>ecommerce-service</artifactId>
        <version>${ecommerce.version}</version>
      </dependency>

      <!-- ========== Spring ========== -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <!-- ========== Spring BootBOM ========== -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <!-- ========== MyBatis ========== -->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>${mybatis.version}</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>${mybatis-spring.version}</version>
      </dependency>

      <!-- ========== 数据库 ========== -->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql-connector.version}</version>
      </dependency>

      <!-- ========== 其他 ========== -->
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons-lang3.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <!-- ==================== 插件版本管理 ==================== -->
  <build>
    <pluginManagement>
      <plugins>
        <!-- 编译插件 -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
          <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <encoding>${project.build.sourceEncoding}</encoding>
          </configuration>
        </plugin>

        <!-- 测试插件 -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.2</version>
        </plugin>

        <!-- 资源插件 -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.2.0</version>
          <configuration>
            <encoding>${project.build.sourceEncoding}</encoding>
          </configuration>
        </plugin>

        <!-- WAR 打包插件 -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.3.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

</project>

父 POM 关键元素说明

元素说明
packaging=pom父模块必须设置为 pom,不生成产物
modules聚合子模块列表
properties统一版本属性
dependencyManagement统一依赖版本,子模块无需写版本
pluginManagement统一插件配置,子模块无需写版本

dependencyManagement vs dependencies

Bash
区别:

dependencies:
- 实际引入依赖
- 子模块自动继承

dependencyManagement:
- 只声明版本,不实际引入
- 子模块需要显式声明才引入
- 子模块无需写版本号

示例:

父 POM(dependencyManagement):
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.3.20</version>  ← 只声明版本
    </dependency>
  </dependencies>
</dependencyManagement>

子模块(dependencies):
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <!-- 无需写版本,继承父 POM版本 -->
  </dependency>
</dependencies>

优势:
- 统一版本管理
- 子模块简化配置
- 升级只需改父 POM

子模块配置

common 模块(最底层)

Bash
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <!-- ==================== 继承父 POM ==================== -->
  <parent>
    <groupId>com.example</groupId>
    <artifactId>ecommerce</artifactId>
    <version>1.0.0</version>
    <relativePath>../pom.xml</relativePath>  <!-- 父 POM路径 -->
  </parent>

  <!-- ==================== 子模块坐标 ==================== -->
  <!-- groupId、version 继承父 POM -->
  <artifactId>ecommerce-common</artifactId>

  <!-- ==================== 模块信息 ==================== -->
  <name>Ecommerce Common</name>
  <description>公共工具类、常量、基础配置</description>

  <!-- ==================== 依赖 ==================== -->
  <dependencies>
    <!-- commons-lang3:工具类增强 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <!-- 版本继承 dependencyManagement -->
    </dependency>

    <!-- 日志接口 -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <!-- 版本由 Spring Boot BOM 管理 -->
    </dependency>

    <!-- 测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <!-- 版本继承,scope=test -->
    </dependency>
  </dependencies>

</project>

api 模块(接口定义层)

Bash
<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.example</groupId>
    <artifactId>ecommerce</artifactId>
    <version>1.0.0</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <artifactId>ecommerce-api</artifactId>
  <name>Ecommerce API</name>
  <description>接口定义、DTO、VO</description>

  <dependencies>
    <!-- 依赖 common 模块 -->
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>ecommerce-common</artifactId>
      <!-- 版本继承 -->
    </dependency>

    <!-- JSON 序列化 -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <!-- 版本由 Spring Boot BOM 管理 -->
    </dependency>

    <!-- 参数校验 -->
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <!-- 版本由 Spring Boot BOM 管理 -->
    </dependency>
  </dependencies>
</project>

dao 模块(数据访问层)

Bash
<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.example</groupId>
    <artifactId>ecommerce</artifactId>
    <version>1.0.0</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <artifactId>ecommerce-dao</artifactId>
  <name>Ecommerce DAO</name>
  <description>数据访问、MyBatis Mapper</description>

  <dependencies>
    <!-- 内部模块 -->
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>ecommerce-common</artifactId>
    </dependency>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>ecommerce-api</artifactId>
    </dependency>

    <!-- MyBatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <!-- 版本继承 -->
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
    </dependency>

    <!-- Spring JDBC -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
    </dependency>

    <!-- 数据库驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>

    <!-- 数据源 -->
    <dependency>
      <groupId>com.zaxxer</groupId>
      <artifactId>HikariCP</artifactId>
      <!-- 版本由 Spring Boot BOM 管理 -->
    </dependency>
  </dependencies>
</project>

service 模块(业务逻辑层)

Bash
<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.example</groupId>
    <artifactId>ecommerce</artifactId>
    <version>1.0.0</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <artifactId>ecommerce-service</artifactId>
  <name>Ecommerce Service</name>
  <description>业务逻辑、事务管理</description>

  <dependencies>
    <!-- 内部模块 -->
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>ecommerce-api</artifactId>
    </dependency>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>ecommerce-dao</artifactId>
    </dependency>

    <!-- Spring -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
    </dependency>

    <!-- Spring Boot -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
  </dependencies>
</project>

web 模块(Web控制层)

Bash
<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.example</groupId>
    <artifactId>ecommerce</artifactId>
    <version>1.0.0</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <artifactId>ecommerce-web</artifactId>
  <packaging>war</packaging>  <!-- Web 模块打包为 WAR -->
  <name>Ecommerce Web</name>
  <description>Web 控制器、前端交互</description>

  <dependencies>
    <!-- 内部模块 -->
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>ecommerce-service</artifactId>
    </dependency>

    <!-- Spring Boot Web -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Servlet API -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <scope>provided</scope>
    </dependency>

    <!-- 测试 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <!-- 插件继承 pluginManagement -->
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

模块职责划分原则

分层原则

模块职责可依赖不可依赖
common工具类、常量、异常无外部模块所有模块
api接口定义、DTOcommondao、service
dao数据访问common、apiservice、web
service业务逻辑api、daoweb
webWeb控制器servicedao、common(间接)

依赖方向规则

XML
规则1:依赖单向传递
- 从上层到下层
- 不允许反向依赖
- 不允许跨层依赖(web 不能直接依赖 dao)

规则2:common 模块零依赖
- 最底层模块
- 只包含纯工具类
- 不依赖其他业务模块

规则3:api 模块只定义接口
- 定义 DTO、VO、接口
- 不包含实现
- 被多个模块共享

规则4:接口与实现分离
- api 定义接口
- service 实现接口
- web 通过 api 调用 service

常见分层模式

text
模式1:经典三层架构

web(控制器)
  ↓
service(业务)
  ↓
dao(数据)

模式2:DDD 分层

web(应用层)
  ↓
application(应用服务)
  ↓
domain(领域模型)
  ↓
infrastructure(基础设施)

模式3:微服务拆分

ecommerce-user-service(用户服务)
ecommerce-order-service(订单服务)
ecommerce-product-service(商品服务)
ecommerce-payment-service(支付服务)

每个服务独立部署

多模块构建

构建全部模块

text
# 在父项目目录执行
mvn clean install

执行顺序(Maven 自动根据依赖决定):
1. ecommerce-common(无依赖,先构建)
2. ecommerce-api(依赖 common)
3. ecommerce-dao(依赖 common、api)
4. ecommerce-service(依赖 api、dao)
5. ecommerce-web(依赖 service)
6. ecommerce-admin(依赖 service)

输出:
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] ecommerce
[INFO] ecommerce-common
[INFO] ecommerce-api
[INFO] ecommerce-dao
[INFO] ecommerce-service
[INFO] ecommerce-web
[INFO] ecommerce-admin
[INFO] ------------------------------------------------------------------------
[INFO] Building ecommerce 1.0.0
[INFO] Building ecommerce-common 1.0.0
...
[INFO] BUILD SUCCESS

构建指定模块

text
# 只构建 web 模块
mvn clean install -pl ecommerce-web

# -pl(--projects)指定模块

构建指定模块及其依赖

text
# 构建 web 模块及其依赖的模块
mvn clean install -pl ecommerce-web -am

# -am(--also-make)同时构建依赖模块

执行顺序:
1. ecommerce-common
2. ecommerce-api
3. ecommerce-dao
4. ecommerce-service
5. ecommerce-web

构建指定模块及其下游

text
# 构建 dao 模块及依赖它的模块
mvn clean install -pl ecommerce-dao -amd

# -amd(--also-make-dependents)同时构建下游模块

执行顺序:
1. ecommerce-dao
2. ecommerce-service
3. ecommerce-web
4. ecommerce-admin

排除某些模块

text
# 构建所有模块,排除 admin
mvn clean install -pl '!ecommerce-admin'

# 注意引号,Windows需要转义
mvn clean install -pl "!ecommerce-admin"

查看构建顺序

text
# 查看反应堆构建顺序
mvn clean install -X | grep "Build Order"

多模块项目最佳实践

实践1:统一版本号

text
<!-- 父 POM 定义版本属性 -->
<properties>
  <ecommerce.version>1.0.0</ecommerce.version>
</properties>

<!-- 所有模块使用同一版本 -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>ecommerce-common</artifactId>
      <version>${ecommerce.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

实践2:模块命名规范

text
命名规范:
- 项目名-模块名
- 例:ecommerce-common、ecommerce-service

好处:
- 一眼看出属于哪个项目
- 一眼看出模块职责

实践3:合理拆分模块

text
何时拆分模块:

拆分条件:
- 代码量大(超过100个类)
- 职责清晰可分离
- 可独立部署
- 不同团队维护

不建议拆分:
- 小项目(几十个类)
- 模块职责不清
- 强耦合无法分离

实践4:避免循环依赖

text
循环依赖示例(错误):

A → B → C → A  ← 循环

报错:
[ERROR] The projects in the reactor contain a cyclic reference

解决:
- 重新设计模块职责
- 将共同依赖提取到新模块

常见问题

问题1:模块构建顺序错误

text
报错:
[ERROR] Failed to execute goal on project ecommerce-web:
Could not resolve dependencies for project com.example:ecommerce-web

原因:
- 依赖的模块未构建
- 模块顺序配置错误

解决:
1. 在父目录执行 mvn clean install
2. 或使用 -am 构建依赖模块
   mvn clean install -pl ecommerce-web -am

问题2:版本不一致

text
问题:
- web依赖 service:1.0.0
- service依赖 dao:1.0.1
- 版本不一致

解决:
使用 dependencyManagement 统一版本
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>ecommerce-dao</artifactId>
      <version>${ecommerce.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

问题3:父 POM找不到

text
报错:
[ERROR] Non-resolvable parent POM

原因:
- relativePath 配置错误
- 父 POM 未 install

解决:
1. 检查 relativePath
2. 先构建父 POM
   mvn clean install -N  # -N 只构建父 POM

要点总结

  1. 多模块拆分:大型项目拆分为独立模块,职责清晰
  2. 父 POM 两个角色:聚合+ 继承
  3. packaging=pom:父模块必须设置为 pom
  4. modules定义子模块:聚合所有子模块
  5. dependencyManagement:统一依赖版本,子模块无需写版本
  6. pluginManagement:统一插件配置,子模块无需写版本
  7. 依赖单向传递:上层依赖下层,不允许反向依赖
  8. 构建命令:-pl 指定模块,-am 构建依赖,-amd 构建下游
  9. 构建顺序:Maven 自动根据依赖关系决定
  10. 统一版本号:使用 properties 统一所有模块版本

📝 发现内容有误?点击此处直接编辑

← 上一篇 多模块构建优化策略
下一篇 → 模块间依赖关系管理
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库