Skip to content

多模块项目

7.1 多模块项目结构设计

多模块项目是指将一个大型项目拆分为多个子模块,每个子模块都是一个独立的 Maven 项目。这种结构可以提高代码的可维护性和可重用性。

多模块项目的优势

  • 模块化设计:将项目按照功能或层次拆分为多个模块,每个模块专注于特定的功能。
  • 代码重用:公共代码可以被多个模块共享,减少重复代码。
  • 并行开发:不同团队可以同时开发不同的模块,提高开发效率。
  • 独立部署:每个模块可以独立构建和部署,便于持续集成和持续部署。

典型的多模块项目结构

parent-project/
├── pom.xml              # 父 POM 文件
├── module-common/       # 公共模块
│   └── pom.xml
├── module-service/      # 服务模块
│   └── pom.xml
└── module-web/          # Web 模块
    └── pom.xml

7.2 父 POM 配置

父 POM 文件是多模块项目的核心,它定义了子模块的共同配置和依赖。

父 POM 基本配置

xml
<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>parent-project</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>
  
  <name>Parent Project</name>
  <description>Parent project for multi-module application</description>
  
  <!-- 子模块 -->
  <modules>
    <module>module-common</module>
    <module>module-service</module>
    <module>module-web</module>
  </modules>
  
  <!-- 依赖管理 -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.20</version>
      </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>11</source>
            <target>11</target>
          </configuration>
        </plugin>
        <!-- 其他插件 -->
      </plugins>
    </pluginManagement>
  </build>
</project>

父 POM 的特点

  • packaging:必须设置为 pom
  • modules:列出所有子模块
  • dependencyManagement:统一管理依赖版本
  • pluginManagement:统一管理插件版本

7.3 模块间依赖管理

在多模块项目中,模块之间可以相互依赖。

子模块 POM 配置

xml
<!-- module-common/pom.xml -->
<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">
  <parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
  </parent>
  
  <modelVersion>4.0.0</modelVersion>
  <artifactId>module-common</artifactId>
  
  <name>Common Module</name>
  <description>Common utilities and shared code</description>
  
  <dependencies>
    <!-- 依赖配置 -->
  </dependencies>
</project>

<!-- module-service/pom.xml -->
<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">
  <parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
  </parent>
  
  <modelVersion>4.0.0</modelVersion>
  <artifactId>module-service</artifactId>
  
  <name>Service Module</name>
  <description>Business logic layer</description>
  
  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>module-common</artifactId>
      <version>${project.version}</version>
    </dependency>
    <!-- 其他依赖 -->
  </dependencies>
</project>

<!-- module-web/pom.xml -->
<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">
  <parent>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
  </parent>
  
  <modelVersion>4.0.0</modelVersion>
  <artifactId>module-web</artifactId>
  <packaging>war</packaging>
  
  <name>Web Module</name>
  <description>Web layer</description>
  
  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>module-service</artifactId>
      <version>${project.version}</version>
    </dependency>
    <!-- 其他依赖 -->
  </dependencies>
</project>

依赖传递

在多模块项目中,依赖会从子模块传递到父模块,因此需要注意避免循环依赖。

7.4 聚合与继承

Maven 的多模块项目使用了两种机制:聚合和继承。

聚合

聚合是指将多个模块组合成一个整体,通过父 POM 的 <modules> 元素来实现。当构建父项目时,Maven 会自动构建所有子模块。

继承

继承是指子模块可以继承父模块的配置,通过子 POM 的 <parent> 元素来实现。子模块可以继承父模块的依赖、插件、属性等配置。

聚合与继承的区别

  • 聚合:用于将多个模块组合成一个整体,便于统一构建
  • 继承:用于代码复用,减少重复配置

在实际项目中,通常同时使用聚合和继承。

7.5 多模块构建技巧

构建整个项目

在父项目目录下执行构建命令,Maven 会自动构建所有子模块:

bash
mvn clean install

构建单个模块

在父项目目录下,可以指定构建单个模块:

bash
mvn clean install -pl module-web

构建模块及其依赖

使用 -am 选项可以构建模块及其依赖:

bash
mvn clean install -pl module-web -am

跳过测试

在构建多模块项目时,可以跳过测试以加快构建速度:

bash
mvn clean install -DskipTests

并行构建

使用 -T 选项可以启用并行构建,提高构建速度:

bash
mvn clean install -T 1C  # 每个 CPU 核心一个线程

通过合理设计多模块项目结构,可以提高项目的可维护性和可扩展性,便于团队协作和持续集成。