百变躲猫猫中文版
94.77MB · 2025-12-01
随着项目规模的增长,单模块架构会面临诸多挑战:
下一章节我将详细讲解多模块项目的核心优势
聚合模块的packaging必须为pom,它负责管理子模块的构建顺序和公共配置。
<!-- 父pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>enterprise-app</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging> <!-- 关键:打包方式为pom -->
<name>企业级应用平台</name>
<description>多模块企业级应用示例</description>
<!-- 子模块声明 -->
<modules>
<module>core-module</module>
<module>service-module</module>
<module>web-module</module>
<module>integration-module</module>
</modules>
</project>
enterprise-app/ # 根目录(聚合模块)
├── pom.xml # 父POM
├── core-module/ # 核心模块
│ ├── pom.xml
│ └── src/
├── service-module/ # 服务模块
│ ├── pom.xml
│ └── src/
├── web-module/ # Web模块
│ ├── pom.xml
│ └── src/
└── integration-module/ # 集成模块
├── pom.xml
└── src/
假设我们有一个电商单模块项目:
// 原始单模块结构
ecommerce-app/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com/company/controller/ # 控制层
│ │ │ ├── com/company/service/ # 业务层
│ │ │ ├── com/company/domain/ # 领域层
│ │ │ ├── com/company/repository/ # 数据层
│ │ │ └── com/company/common/ # 通用工具
│ │ └── resources/
│ └── test/
└── 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.company.ecommerce</groupId>
<artifactId>ecommerce-platform</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 模块声明 -->
<modules>
<module>ecommerce-core</module>
<module>ecommerce-service</module>
<module>ecommerce-web</module>
<module>ecommerce-integration</module>
</modules>
<!-- 属性管理 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<spring.version>5.3.8</spring.version>
<junit.version>5.7.2</junit.version>
</properties>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- Spring框架依赖管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</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>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
<!-- ecommerce-core/pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<!-- 继承父POM -->
<parent>
<groupId>com.company.ecommerce</groupId>
<artifactId>ecommerce-platform</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>ecommerce-core</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- 核心模块依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
核心模块包含内容:
<!-- ecommerce-service/pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.company.ecommerce</groupId>
<artifactId>ecommerce-platform</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>ecommerce-service</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- 依赖核心模块 -->
<dependency>
<groupId>com.company.ecommerce</groupId>
<artifactId>ecommerce-core</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 服务模块特有依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies>
</project>
<!-- ecommerce-web/pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.company.ecommerce</groupId>
<artifactId>ecommerce-platform</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>ecommerce-web</artifactId>
<packaging>war</packaging> <!-- Web应用打包为WAR -->
<dependencies>
<!-- 依赖服务模块 -->
<dependency>
<groupId>com.company.ecommerce</groupId>
<artifactId>ecommerce-service</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Web模块特有依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>ecommerce-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
</project>
<!-- ecommerce-integration/pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.company.ecommerce</groupId>
<artifactId>ecommerce-platform</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>ecommerce-integration</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- 依赖核心模块 -->
<dependency>
<groupId>com.company.ecommerce</groupId>
<artifactId>ecommerce-core</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 集成模块特有依赖 -->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-core</artifactId>
<version>5.5.2</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>
</project>
# 在根目录执行,构建所有模块
mvn clean install
# 构建顺序:core → service → integration → web
# Maven会自动识别依赖关系,按正确顺序构建
# 只构建核心模块
mvn -pl ecommerce-core clean install
# 构建核心模块及其依赖模块
mvn -pl ecommerce-web -am clean install
# 排除特定模块构建
mvn clean install -Dmaven.test.skip=true -pl !ecommerce-integration
# 分析依赖树,查看模块间关系
mvn dependency:tree
# 输出示例:
[INFO] com.company.ecommerce:ecommerce-platform:pom:1.0.0-SNAPSHOT
[INFO] +-- ecommerce-core:jar:1.0.0-SNAPSHOT:compile
[INFO] +-- ecommerce-service:jar:1.0.0-SNAPSHOT:compile
[INFO] | - ecommerce-core:jar:1.0.0-SNAPSHOT:compile
[INFO] +-- ecommerce-web:war:1.0.0-SNAPSHOT:compile
[INFO] | - ecommerce-service:jar:1.0.0-SNAPSHOT:compile
[INFO] - ecommerce-integration:jar:1.0.0-SNAPSHOT:compile
[INFO] - ecommerce-core:jar:1.0.0-SNAPSHOT:compile
对于超大型项目,可以将聚合和继承分离:
<!-- 聚合POM(只负责模块聚合) -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>project-aggregator</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>parent-pom</module>
<module>core-module</module>
<module>service-module</module>
</modules>
</project>
<!-- 父POM(只负责依赖管理) -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>project-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<dependencyManagement>
<!-- 统一的依赖管理 -->
</dependencyManagement>
</project>
<!-- 在父POM中统一管理模块版本 -->
<properties>
<core.version>1.0.0</core.version>
<service.version>1.0.0</service.version>
<web.version>1.0.0</web.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.company.ecommerce</groupId>
<artifactId>ecommerce-core</artifactId>
<version>${core.version}</version>
</dependency>
<dependency>
<groupId>com.company.ecommerce</groupId>
<artifactId>ecommerce-service</artifactId>
<version>${service.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 支持不同环境的配置 -->
<profiles>
<profile>
<id>dev</id>
<properties>
<build.env>dev</build.env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<build.env>prod</build.env>
</properties>
</profile>
</profiles>
# 错误:模块A依赖模块B,模块B又依赖模块A
[ERROR] The projects in the reactor contain a cyclic reference:
[ERROR] Edge between 'Vertex{label='com.company:module-a'}' and
[ERROR] 'Vertex{label='com.company:module-b'}'
解决方案:提取公共代码到第三个模块,或重新设计模块职责。
# 确保模块依赖关系正确
mvn clean install -rf :failed-module # 从失败模块重新开始
<!-- 使用dependencyManagement统一版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>common-lib</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
多模块项目是Maven最强大的特性之一,通过合理的模块拆分可以带来:
掌握多模块项目设计与构建,是成为Maven高级使用者的重要里程碑。在实际项目中,建议根据业务复杂度和团队规模,合理规划模块拆分粒度,平衡模块化带来的好处与复杂性成本。