Appearance
多模块项目
7.1 多模块项目结构设计
多模块项目是指将一个大型项目拆分为多个子模块,每个子模块都是一个独立的 Maven 项目。这种结构可以提高代码的可维护性和可重用性。
多模块项目的优势
- 模块化设计:将项目按照功能或层次拆分为多个模块,每个模块专注于特定的功能。
- 代码重用:公共代码可以被多个模块共享,减少重复代码。
- 并行开发:不同团队可以同时开发不同的模块,提高开发效率。
- 独立部署:每个模块可以独立构建和部署,便于持续集成和持续部署。
典型的多模块项目结构
parent-project/
├── pom.xml # 父 POM 文件
├── module-common/ # 公共模块
│ └── pom.xml
├── module-service/ # 服务模块
│ └── pom.xml
└── module-web/ # Web 模块
└── pom.xml7.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 核心一个线程通过合理设计多模块项目结构,可以提高项目的可维护性和可扩展性,便于团队协作和持续集成。